[英]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.