此问题在此处已有答案:
Why not generate the secret key every time Flask starts?(1个答案)
13天前关闭。
这篇文章是6天前编辑并提交审查的。
我最近将我的站点迁移到另一个环境(PythonAnywhere到Vultr),现在需要自己设置服务器。我已经让一切运行,但我注意到我的表单POST并不总是提交。似乎50%的POST工作,其他50%不工作。无论页面是否刷新,每次提交的成功似乎完全是随机的。我在PythonAnywhere上没有遇到这个问题,或者在Windows上本地开发网站时,所以我怀疑这是NGINX和/或gunicorn配置的问题。main.py - the route that submits 50/50. The other form routes have the same strange behaviour - they don't always submit, and the form remains filled out.
:
@app.route("/", methods=["GET", "POST"])
def home():
form = CommentForm()
if form.validate_on_submit():
create_entry(form.comment.data)
flash('<img src="/static/media/thank_you.jpg"/><h1>Thank you!</h1>')
return redirect(url_for("home"))
return render_template(
"home.html", form=form, comments=get_comments(),
)
home.html - the flash snippet which sometimes displays the <img> and <h1> flash message
:
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
{{ message | safe }} <!-- safe used to render <img> and <h1> -->
{% endfor %}
{% endif %}
{% endwith %}
{% block body %}{% endblock %}
/etc/systemd/system/gunicorn.service
:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/ubuntu/NAME.com
Environment="PATH=/home/ubuntu/venv_flask/bin"
ExecStart=/home/ubuntu/venv_flask/bin/gunicorn -w 2 -b 127.0.0.1:9001 'main:app'
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-enabled
:
server {
server_name NAME.com www.NAME.com;
root /home/ubuntu/NAME.com;
location / {
proxy_pass http://127.0.0.1:9001/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /;
# tried adding `proxy_set_header Cookie $http_cookie;` with no luck
}
}
编辑
我已经添加了一个额外的工人(现在总共3个),并完全卸载了docker。我觉得可能是硬件限制...将继续调查。
不,资源看起来还不错...
!代码到达form.validate_on_submit()
,由于某种原因计算为False
...
啊哈!{'csrf_token': ['The CSRF token is invalid.']}
这个问题应该是开放的,以帮助其他人谁做类似的搜索。它提供了指导调试,并提出这个问题的方式是独特的-它可以说不是一个重复。我的问题的答案是相关的张贴重复的问题,但问题是不是一个重复。管好自己的事,让我真正的和适当的问题开放!
1条答案
按热度按时间bfrts1fy1#
对于我的本地和PythonAnywhere示例,我使用了
app.secret_key = os.urandom(16)
。不知何故,这起作用了...也许是因为这些示例只使用了一个worker?在任何情况下,设置app.secret_key = <CONSTANT>
都起作用了,并解决了我得到的隐藏CSRF错误。