python - 运行 FlaskClient 测试方法时出现 404 响应

标签 python flask

我对此感到困惑。我在 Flask 应用程序中使用应用程序工厂,在测试配置下我的路由总是返回 404。

但是,当我使用 Flask-Script 并从解释器加载应用程序时,一切都按预期工作,响应返回为 200。

使用浏览器导航到 URL 工作正常

app/__init__.py

def create_app():
 app = Flask(__name__)
return app

服务器1.py

from flask import Flask
from flask_script import Manager
from app import create_app  

app = create_app()
app_context = app.app_context()
app_context.push()
manager = Manager(app)


@app.route('/')
def index():
 return '<h1>Hello World!</h1>'

@app.route('/user/<name>')
def user(name):
 return '<h1>Hello, %s!</h1>' % name

@manager.command
def test():
 """Run the unit tests"""
 import unittest
 tests = unittest.TestLoader().discover('tests')
 unittest.TextTestRunner(verbosity=2).run(tests)


if __name__ == '__main__':
 manager.run()

测试/测试.py

#imports committed 
def setUp(self):
    self.app = create_app('testing')
    self.app_context = self.app.app_context()
    self.app_context.push() 
    self.client = self.app.test_client()

def test_app_exists(self):
    response = self.client.get('/', follow_redirects=True)
    print(response) #404 :(
    self.assertTrue("Hello World!" in response.get_data()) #this is just an example of how it fails

最佳答案

您没有正确使用工厂模式。您应该使用蓝图来收集路线并将其注册到工厂中的应用程序。 (或在工厂中使用 app.add_url_rule。)工厂外的任何东西都不应影响应用程序。

现在您创建应用程序的一个实例,然后使用该实例注册路由。然后你在你的测试中创建一个不同的实例,它没有注册路由。由于该实例没有任何已注册的路由,它会为对这些 url 的请求返回 404。

相反,使用蓝图注册您的路线,然后使用工厂中的应用程序注册蓝图。在测试期间使用工厂创建应用程序。将工厂传递给 Flask-Script 管理器。您不需要手动推送应用上下文。

from flask import Flask, Blueprint
from flask_script import Manager
from unittest import TestCase


bp = Blueprint('myapp', __name__)

@bp.route('/')
def index():
    return 'Hello, World!'

def create_app(config='dev'):
    app = Flask(__name__)
    # config goes here

    app.register_blueprint(bp)

    return app

class SomeTest(TestCase):
    def setUp(self):
        self.app = create_app(config='test')
        self.client = self.app.test_client()

    def test_index(self):
        rv = self.client.get('/')
        self.assertEqual(rv.data, b'Hello, World!')

manager = Manager(create_app)
manager.add_option('-c', '--config', dest='config', required=False)

if __name__ == '__main__':
    manager.run()

关于python - 运行 FlaskClient 测试方法时出现 404 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39714995/

相关文章:

python - 求函数的最小值?

python - Conda 依赖问题

python - flask模板继承教程

javascript - 如何使用 Flask 添加 POST 请求的确认对话框?

eclipse - 如何使用 PyDev 调试 Flask?

python - uwsgi 上的 Flask 应用程序给出 TypeError : 'Flask' object is not iterable

python - 在 OpenCV 2.4 上找不到 GaussianBlur 模块

python - 防止在 SymPy 中计算指数

python - 在 python 中不使用 "+"运算符的两个整数之和

python - 在 Flask 中引用父目录上方的静态文件