【发布时间】:2016-12-02 02:51:54
【问题描述】:
在我的项目 __init__.py 我有这个:
app = Flask(__name__)
app.config.from_object('config')
CsrfProtect(app)
db = SQLAlchemy(app)
我的开发配置文件如下所示:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
DEBUG = True
WTF_CSRF_ENABLED = True
SECRET_KEY = 'supersecretkey'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'project.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
在我的单元测试设置中,我有这个:
from project import app, db
class ExampleTest(unittest.TestCase):
def setUp(self):
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
self.app = app.test_client()
db.create_all()
理论上,在此处将 WTF_CSRF_ENABLED 设置为 False 应该可以防止 CSRF 用于单元测试,但是如果我在单元测试时执行 POST,我仍然会收到 CSRF 错误。我认为这是因为我已经调用了 CsrfProtect(app) 而 WTF_CSRF_ENABLED 为 True (当我导入应用程序时,它被调用)。如果我在配置文件中设置 WTF_CSRF_ENABLED = False,它会按预期工作。
在启用 CSRF 后,我是否可以禁用它?还是我在这里找错树了?
【问题讨论】:
-
我认为一旦您导入应用程序,该代码就会运行,因此它将使用您的默认配置运行,因此之后当您进行测试时,您是否覆盖配置并不重要
-
是的,这也是我的想法。我希望事后有某种方法可以禁用它,也许不是通过 app.config,而是像 StopCsrfProtect(app) 之类的东西。但这可能是一厢情愿的想法。
-
我想最简单的解决方法是在测试时禁用 CSRF 来运行它。
-
我可以这样做,但我担心它可能会弄乱任何集成测试。我要么需要记住在运行单元测试时来回更改配置文件,要么在开发时冒着看不到真正的 csrf 错误的风险(忘记在 jinja 模板中放置 hidden_tag 或其他东西)。嗯……
标签: flask flask-wtforms