首页 > 解决方案 > before_action ...仅限:如何在python烧瓶中执行此操作?

问题描述

我需要将 ruby​​ 代码更改为 python,我对此也很陌生。有人能告诉我有没有像 before_action 这样的功能......仅限:在 python 烧瓶中?这是我要更改的功能:

class IftttController < ActionController::Base
  before_action :return_errors_unless_valid_service_key
  before_action :return_errors_unless_valid_action_fields, only: :create_new_thing

def return_errors_unless_valid_service_key
      unless request.headers["HTTP_IFTTT_SERVICE_KEY"] == IFTTT_SERVICE_KEY
        return render plain: { errors: [ { message: "401" } ] }.to_json, status: 401
      end
    end

    def return_errors_unless_valid_action_fields
      if params[:actionFields] && params[:actionFields][:invalid] == "true"
        return render plain: { errors: [ { status: "SKIP", message: "400" } ] }.to_json, status: 400
      end
    end
end

正如我在互联网上阅读的那样,@app.before_request 等于它,但我不知道如何将它用于特定操作(before_action:return_errors_unless_valid_action_fields,仅::create_new_thing),就像在 ruby​​ on rails 上一样,这是我的代码,我不知道它是否正确:

@ifttt.before_request
def return_errors_unless_valid_action_fields():
    if request.args.get("actionFields") and request.args["actionFields"]["invalid"] == True:
        return render_template_string(jsonify(errors = [{status= "SKIP", message = "400"}]), 400

谁能帮我?非常感谢。

标签: pythonflask

解决方案


Flask 应用程序有一些钩子可以让用户在请求之前或之后运行函数:

app = Flask(...)

@app.before_request
def i_have_been_called():
    print('I have been called')

这应该在每个请求之前向控制台输出“我已被调用”。

Flask 中内置的其他钩子包括before_requestbefore_first_requestafter_requestteardown_appcontext

至于only:参数,Flask中没有这样的东西。您必须简单地编写函数来检查这种情况:

@app.before_request
def i_prefer_post():
    from flask import request
    if request.method == 'POST':
        print('I prefer POST')

推荐阅读