如何使用flask-wft为restapi禁用csrf的视图?

xir*_*uru 7 python flask flask-wtforms flask-restful

我在使用flask-wtf 为restapi 禁用csrf 时遇到问题。问题与此处类似:由于 Flask-WTF 的 CSRF 保护,Flask-Restful POST 失败,但我使用 flask original 而不是 flask-restful。

我使用了@csrf.exempt装饰器,而且我确实像文档一样,但仍然无法禁用 csrf。这是我的代码,你知道是什么问题吗?

我的应用程序

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField
from flask_wtf.csrf import CSRFProtect

app = Flask(__name__)    
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SECRET_KEY'] = "secret"

db = SQLAlchemy(app)

csrf = CSRFProtect(app) # initialize the csrf protect

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String())

class myForm(FlaskForm):
    username = StringField("user name")

@app.route("/check", methods=['POST'])    
@csrf.exempt # why this code doesn't work???!!! :(
def check():
    form = myForm(request.form)

    if form.validate():
        user = User(username=form.username.data)
        db.session.add(user)
        db.session.commit()
        return jsonify(message="user saved!"), 200
    else:
        return jsonify(message=form.errors), 404

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我的邮递员总是回来:

{
    "message": {
        "csrf_token": [
            "The CSRF token is missing."
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 12

您可以在构造函数中传递 meta={'csrf': False} 作为参数

form = myForm(request.form, meta={'csrf': False})
Run Code Online (Sandbox Code Playgroud)


J.J*_*ala 8

FlaskForm.validate() 似乎是返回该错误的那个,即尝试

form = myForm(request.form, csrf_enabled=False)
Run Code Online (Sandbox Code Playgroud)

或者

class myForm(FlaskForm):
    class Meta:
        csrf = False

     username = StringField("user name")
Run Code Online (Sandbox Code Playgroud)

因为csrf_enabled似乎已被弃用。

从文档

任何使用 FlaskForm 处理请求的视图都已经获得 CSRF 保护。

  • 当我执行 Flask 应用程序时,出现了有关“csrf_enabled”的弃用警告。在 `myForm` 中使用 `class Meta..` 应仅限于类 `myForm` 的实例。我认为“CSRFProtect”实例提供的装饰器适用于不调用“FlaskForm.validate()”的视图,所以可能不是。 (2认同)