简体   繁体   English

使用Flask before_request和after_request进行原子交易

[英]Atomic transactions using Flask before_request and after_request

I am trying to make py2neo transactions with Flask atomic by means of using before_request to start a transaction and after_request to commit or rollback, depending on the response status code. 我试图通过使用before_request来启动事务,并使用after_request来提交或回滚,从而使Flask原子进行py2neo事务,具体取决于响应状态代码。

This is my code: 这是我的代码:

from flask import Flask, request, app, g
from flask_restful import Resource, Api, abort
from werkzeug.wrappers import Request
from py2neo import Graph
import models

app = Flask(__name__)
api = Api(app)

def get_db():
    return Graph(password="secret")

graph = get_db()
tx = None

@app.before_request
def before_request():
    tx = graph.begin()

@app.after_request
def after_request(response):
    if response.status_code >= 400:
        tx.rollback()
    else:
        tx.commit() # Error line

The problem is that modifications to module variable tx made on before_request seem not to be noticeable by after_request , so I get this error: 问题是,修改模块可变tx做出对before_request似乎不是由明显after_request ,所以我得到这个错误:

AttributeError: 'NoneType' object has no attribute 'commit'

I found a solution. 我找到了解决方案。 All I had to do is to use flask g object to store tx so it can be available for all methods called along the request: 我要做的就是使用flask g对象存储tx以便它可用于沿着请求调用的所有方法:

from flask import Flask, request, app, g
from flask_restful import Resource, Api, abort
from werkzeug.wrappers import Request
from py2neo import Graph
import models

app = Flask(__name__)
api = Api(app)

def get_db():
    return Graph(password="SteppenWolf1")

graph = get_db()

@app.before_request
def before_request():
    g.tx = graph.begin()

@app.after_request
def after_request(response):
    tx = g.get('tx')
    if response.status_code >= 400:
        tx.rollback()
    else:
        tx.commit()

    return response

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM