【问题标题】:Flask-WTF / WTForms with Unittest fails validation, but works without Unittest带有 Unittest 的 Flask-WTF / WTForms 验证失败,但没有 Unittest 也可以工作
【发布时间】:2014-02-05 12:35:35
【问题描述】:

当我正常运行应用程序并在浏览器中登录时,它可以工作。但是使用 Unittest 它不会让我登录 .... ,它会再次返回登录页面。
“print rv.data”都只是打印登录页面的内容,但它应该打印索引页面的内容,即login_required
如果有帮助,我将使用 SQLAlchemy 作为 ORM。 任何人都知道可能是什么问题?如果需要更多代码,我会提供。 我已经尝试在这里搜索类似的问题,但没有找到。

#!flask/bin/python
import os
import unittest

from config import basedir
from app import app, db
from app.models import User,Exam,Attempt,Subject

class TestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        app.config['CSRF_ENABLED'] = False
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
        self.app = app.test_client()
        db.create_all()
    
    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def login(self, username, password):
        return self.app.post('/login', data=dict(
            username=username,
            password=password
        ), follow_redirects=True)

    def test_users(self):
        u = User(username = 'gaucan', password = 'gau')
        db.session.add(u)
        db.session.commit()
        
        rv = self.login('gaucan','gau')
        print rv.data
        rv = self.app.get('/',follow_redirects=True)
        print rv.data

if __name__ == '__main__':
    unittest.main()

我添加了查看登录功能给你看...

@app.route('/login', methods = ['GET', 'POST'])
def login():
    if g.user is not None and g.user.is_authenticated():
        return redirect(url_for('index'))

    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username = form.username.data).first()
        if user is not None and form.password.data == user.password:
            login_user(user)
            flash("Logged in successfully.")
            return redirect(request.args.get('next') or url_for('index'))

        flash('Invalid password')

    return render_template('login.html', title='Sign In', form=form)

这是 form.validate_on_submit 上一行的回溯

> /home/gaucan/webdev/projekt2/app/views.py(131)login()
-> if form.validate_on_submit():
(Pdb) bt
  /home/gaucan/webdev/projekt2/shit.py(41)<module>()
-> unittest.main()
  /usr/lib64/python2.7/unittest/main.py(95)__init__()
-> self.runTests()
  /usr/lib64/python2.7/unittest/main.py(232)runTests()
-> self.result = testRunner.run(self.test)
  /usr/lib64/python2.7/unittest/runner.py(151)run()
-> test(result)
  /usr/lib64/python2.7/unittest/suite.py(70)__call__()
-> return self.run(*args, **kwds)
  /usr/lib64/python2.7/unittest/suite.py(108)run()
-> test(result)
  /usr/lib64/python2.7/unittest/suite.py(70)__call__()
-> return self.run(*args, **kwds)
  /usr/lib64/python2.7/unittest/suite.py(108)run()
-> test(result)
  /usr/lib64/python2.7/unittest/case.py(433)__call__()
-> return self.run(*args, **kwds)
  /usr/lib64/python2.7/unittest/case.py(369)run()
-> testMethod()
  /home/gaucan/webdev/projekt2/shit.py(35)test_users()
-> rv = self.login('gaucan','gau')
  /home/gaucan/webdev/projekt2/shit.py(28)login()
-> ), follow_redirects=True)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(771)post()
-> return self.open(*args, **kw)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/testing.py(108)open()
-> follow_redirects=follow_redirects)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(735)open()
-> response = self.run_wsgi_app(environ, buffered=buffered)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(658)run_wsgi_app()
-> rv = run_wsgi_app(self.application, environ, buffered=buffered)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(854)run_wsgi_app()
-> app_iter = app(environ, start_response)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1836)__call__()
-> return self.wsgi_app(environ, start_response)
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1817)wsgi_app()
-> response = self.full_dispatch_request()
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1475)full_dispatch_request()
-> rv = self.dispatch_request()
  /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1461)dispatch_request()
-> return self.view_functions[rule.endpoint](**req.view_args)
> /home/gaucan/webdev/projekt2/app/views.py(131)login()
-> if form.validate_on_submit():
(Pdb) 

【问题讨论】:

  • 用户是否已经存在于数据库中?
  • @Sean:是的。奇怪的是它在正常运行但在单元测试中不起作用...如果有帮助,我现在添加了查看登录功能..
  • 我认为处理了很多“打印消息”:D 问题是 form.validate_on_submit() 返回 FALSE .... 但我不知道为什么...可能使用 Flask-login,单元测试必须以不同的方式完成吗?
  • form.validate_on_submit 正上方添加一个import pdb; pdb.set_trace() 并再次运行您的单元测试...您应该得到一个调试器,您可以进入validate_on_submit 看看发生了什么;-)跨度>
  • 我已经从上面的行添加了回溯验证...有什么想法吗?

标签: python flask


【解决方案1】:

您应该设置 WTF_CSRF_ENABLED 而不是 CSRF_ENABLED - 现在,Flask-WTForms 正在尝试验证您的 CSRF 令牌,但您没有提供:

class TestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        # Wrong key:
        # app.config['CSRF_ENABLED'] = False
        # Right key:
        app.config['WTF_CSRF_ENABLED'] = False

【讨论】:

  • 谢谢!我爱你^_^,你是怎么发现问题出在哪里的?
  • @user3263155 - 我自己之前也遇到过同样的问题 - 他们最近才更改了密钥。
  • 非常感谢你,如果我能加倍投票,我会的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多