Flask WTForms不总是提交(gunicorn + nginx)[重复]

kxeu7u2r  于 2023-03-29  发布在  Nginx
关注(0)|答案(1)|浏览(154)

此问题在此处已有答案

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.']}
这个问题应该是开放的,以帮助其他人谁做类似的搜索。它提供了指导调试,并提出这个问题的方式是独特的-它可以说不是一个重复。我的问题的答案是相关的张贴重复的问题,但问题是不是一个重复。管好自己的事,让我真正的和适当的问题开放!

bfrts1fy

bfrts1fy1#

对于我的本地和PythonAnywhere示例,我使用了app.secret_key = os.urandom(16)。不知何故,这起作用了...也许是因为这些示例只使用了一个worker?在任何情况下,设置app.secret_key = <CONSTANT>都起作用了,并解决了我得到的隐藏CSRF错误。

相关问题