【问题标题】:Atomic transactions using Flask before_request and after_request使用 Flask before_request 和 after_request 的原子事务
【发布时间】:2019-08-14 20:33:54
【问题描述】:

我正在尝试使用 Flask 原子的 py2neo 事务,方法是使用 before_request 启动事务并使用 after_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

问题是在before_request 上对模块变量tx 所做的修改似乎不会被after_request 注意到,所以我收到了这个错误:

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

【问题讨论】:

    标签: python flask py2neo


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2013-01-23
      相关资源
      最近更新 更多