首页 > 解决方案 > 使用 Flask before_request 和 after_request 的原子事务

问题描述

我正在尝试通过使用启动事务并提交或回滚来使用Flask atomic进行py2neo事务,具体取决于响应状态代码。before_requestafter_request

这是我的代码:

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

问题是对模块变量的修改tx似乎before_request不明显after_request,所以我得到这个错误:

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

标签: pythonflaskpy2neo

解决方案


我找到了解决方案。我所要做的就是使用烧瓶 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

推荐阅读