如何检查Python类中的请求方法?

DeN*_*DeN 4 python flask

我有一个Flask课:

class Likes(object):
    def __init__(self, model, table_id):
        self.model = model
        self.table_id = table_id

        if request.form["likes"] == 'like':
            query = self.model.query.filter_by(id=table_id).first()
            query.likes += 1
            db.session.commit()
            flash(u'Like =)) ' + query.title, 'info')
        elif request.form["likes"] == 'dislike':
            query = self.model.query.filter_by(id=table_id).first()
            query.likes -= 1
            db.session.commit()
            flash(u"Don't like =(" + query.title, 'info')
Run Code Online (Sandbox Code Playgroud)

我希望每次用户发送POST请求时调用此类,但每次创建我的类的实例时,我都需要添加检查请求类型:

# ...
if request.method == 'POST':
    Likes(Post, request.form["post_id"])
# ...
Run Code Online (Sandbox Code Playgroud)

如何改进我的课程并在其中添加此检查:

if request.method == 'POST':
    # ...
Run Code Online (Sandbox Code Playgroud)

解决方案: 使用装饰器@ app.before_request

@app.before_request
def before_req():
    if request.method == 'POST':
        flash(u'Before request', 'success')
Run Code Online (Sandbox Code Playgroud)

ami*_*che 11

您可以使用Flask.request_started信号在每次请求到达时运行某些内容,然后执行您需要的代码.

flask.request_started

此信号在任何请求处理开始之前发送,但是在设置请求上下文时发送.由于请求上下文已经绑定,因此订阅者可以使用标准全局代理(例如请求)访问请求.

查看Flask的Signals章节以了解更多信息.

在代码中使用类似的东西:

def create_like(sender, **extra):
    if request.method == 'POST':
        Likes(Post, request.form["post_id"])


from flask import request_started
request_started.connect(create_like, app)
Run Code Online (Sandbox Code Playgroud)

这是根据核心信号文档的示例改编的.

  • 谢谢你的帮助=)你给了我一个好主意和正确的信息,但是你的函数变体与导入使用装饰器@app.before_request我在这里找到http://stackoverflow.com/questions/14367991/ (2认同)