现在我正在尝试使用nginx + unicorn + Flask来开发服务器。
如果我只执行 python,csrf_tokens 可以正常工作。
但是,如果我使用nginx+unicorn+flask执行python,就会出现错误。
400 BAD 请求 - CSRF 会话令牌丢失。或者 CSRF 令牌不匹配。
我应该为 nginx 的会话做额外的设置吗?
或者我错过了什么吗??
应用程序/init.py
from flask_wtf.csrf import CsrfProtect
csrf = CsrfProtect()
def create_app(config_name):
app = Flask(__name__, instance_path='/instance')
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
moment.init_app(app)
csrf.init_app(app)
app.config.update(CSRF_ENABLED = app.config['CSRF_ENABLED'])
//CSRF_ENABLED = True
return app
登录.html
<form action="{{url_for('.login')}}" class="form-signin text-center" method="POST">
{{ form.csrf_token }}
</form>
我在项目中经常使用flask+gunicorn+nginx的组合。对于我的表单,我使用不同的方法:
form.py:
from wtforms import StringField, SubmitField, IntegerField
from wtforms.validators import DataRequired, Optional
class IdentityForm(FlaskForm):
age = IntegerField("Type your age", validators=[Optional()])
name = StringField("Type your name*", validators=[DataRequired()])
submit = SubmitField("Submit")
page.html
<form action="" method="post" novalidate>
{{ form.hidden_tag() }}
{{ form.age.label }}<br>
{{ form.age() }}
{{ form.name.label }}<br>
{{ form.name() }}
{{ form.submit() }}
</form>
在这个小例子中,我们关心的部分是 HTML 方面的参数
form.hidden_tag()
。此参数生成一个隐藏字段,其中包含用于保护表单免受 CSRF 攻击的令牌。
为此,需要在烧瓶配置中定义变量 SECRET_KEY
:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'do-not-get-tired-youll-never-find'
SECRET_KEY
是一个加密密钥,可以生成签名或令牌。 FLASK_WTF
使用它来保护表单免受 CSRF 攻击。
仅此而已。
FLASK_WTF
为您处理剩下的事情
要了解更多信息,请查看this
我遇到这篇文章试图解决类似的问题,我的问题是由于 Flask 使用端口 8443 和 5000。在你的 nginx 配置中尝试这个配置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
它对我有用