我刚刚建立了我的生产环境的瓶应用程序,我一直在开发。
这个堆栈是:
Windows Server 2012 R2
Hyper-V VM
- Running Ubuntu 14.04
Docker 1.5
- Running Containers:
mysql 5.6
nginx 1.6.3
uwsgi 2.0.10基本上,我在Ubuntu中设置了一个静态IP,端口80被转发到nginx容器,nginx和uwsgi容器之间为套接字文件共享了一个数据卷,最后在mysql容器和uwsgi容器之间建立了一个用于数据库通信的链接。
在我的本地开发环境中,我已经在下面的实现中使用CSRF了一段时间了,没有任何问题:
from flask_wtf import Form
class UserForm(Form):
...然后在我的模板里:
<form>
{{ form.hidden_tag() }}
...
</form>但是,当我将我的应用程序移动到上面指定的环境时,我得到:
错误的请求 CSRF令牌丢失或不正确。
作为回应,当我试图提交一份表格时。我正在使用相同的requirements.txt文件与pip设置我的瓶应用程序。我还验证了CSRF令牌确实在页面的HTML中。
有人知道为什么会发生这种事吗?
编辑:
为了回答评论中的问题:我的产品码头容器中的Flask和WTForms的版本和我开发的本地虚拟主机都是相同的。下面是我从dev环境生成的需求文件,用于在docker容器中设置我的应用程序:
Flask==0.10.1
Flask-Login==0.2.11
Flask-Mail==0.9.1
Flask-Migrate==1.2.0
Flask-MySQL==1.2
Flask-Principal==0.4.0
Flask-SQLAlchemy==2.0
Flask-Script==2.0.5
Flask-Security==1.7.4
Flask-WTF==0.10.2
Flask-WhooshAlchemy==0.55a
Jinja2==2.7.3
Mako==1.0.0
MarkupSafe==0.23
PyMySQL==0.6.2
SQLAlchemy==0.7.9
Tempita==0.5.2
WTForms==2.0.1
Werkzeug==0.9.6
Whoosh==2.6.0
alembic==0.6.7
blinker==1.3
chardet==2.2.1
decorator==3.4.0
itsdangerous==0.24
lamson==1.3.4
passlib==1.6.2
py-bcrypt==0.4
pytz==2014.9
sqlalchemy-migrate==0.7.2尽管如此,由于安装了uWSGI和我的烧瓶应用程序,在我的对接容器中有几个额外的模块。这是额外的。
argparse (1.2.1)
colorama (0.2.5)
docutils (0.12)
html5lib (0.999)
lockfile (0.10.2)
mock (1.0.1)
MySQL-python (1.2.5)
nose (1.3.6)
python-daemon (2.0.5)
python-modargs (1.7)
requests (2.2.1)
six (1.5.2)
urllib3 (1.7.1)
uWSGI (2.0.10)
wheel (0.24.0)
wsgiref (0.1.2)哇,比一对夫妇还多。也许我有个矛盾的包裹?
关于SECRET_KEY和CSRF_SESSION_KEY:我在config.py中定义了SECRET_KEY。我被引导相信,如果不定义CSRF_SESSION_KEY,它将默认为SECRET_KEY。尽管如此,我还是定义了一个CSRF_SESSION_KEY,但是它似乎没有什么区别。
最后,我查看了API从{{ form.hidden_tag() }到{ form.csrf_token }的变化。对于最新版本,它们仍然在文档中引用这两种表单。在CSRF页面上,他们有后者,但在快速启动时,他们仍然拥有前者。我不知道这是怎么回事,但为了确定我在CSRF页面上实现了这个版本,如下所示:
init.py:
from flask_wtf.csrf import CsrfProtect
CsrfProtect(app)user_login.html
<form>
{{ form.csrf_token }}
...
</form>但我还是得到了同样的回应。
正如我之前说过的,水瓶-WTF文档到处都是。所以我一直在尝试各种组合。在这个页面的底部:http://flask-wtf.readthedocs.org/en/latest/csrf.html他们引用了一个不正确的导入,所以我替换了
从flask_wtf导入表单
使用
从flask.ext.wtf导入表单
还是没有骰子。谢谢你的评论,给了我更多的尝试!
我还试着把所有的东西整合到一个码头容器中,但是我还是得到了同样的结果。
发布于 2015-05-13 19:11:13
基本上,我的开发config.py文件中有这样的内容:
SERVER_NAME = 'localhost:5000‘
当我将该应用程序放到生产环境中时,我不得不将其更改为:
SERVER_NAME = '192.168.1.66‘
这个应用程序就会出现。但最后,我不得不把它全部评论掉。根据我的研究,只有当你把应用程序放在子域时才有必要,而我不是。
如果有人能更深入地了解这会导致CSRF令牌失效的原因,我很想听听。我再也找不到这件事了。所以现在,我已经把它完全移除了。
https://stackoverflow.com/questions/30134427
复制相似问题