我有一个网址列表,需要找到所有不会去找Flask的404找不到网页的网址。有没有办法检查这个?
答案 0 :(得分:1)
使用底层网址映射模拟Flask尝试将每个网址作为请求分发时会发生什么。这要求路径,HTTP方法(例如GET)和任何查询参数都是已知的并且是分开的。
from werkzeug.routing import RequestRedirect, MethodNotAllowed, NotFound
to_test = (
('/user/1', 'GET', {}),
('/post/my-title/edit', 'POST', {}),
('/comments', 'GET', {'spam': 1}),
)
good = []
adapter = app.create_url_adapter(None)
if adapter is None:
raise Exception('configure a SERVER_NAME for the app')
for path, method, args in to_test:
try:
adapter.match(path, method, query_args=args)
except RequestRedirect:
pass
except (MethodNotAllowed, NotFound):
continue
good.append((path, method, args))
# good list now contains all tuples that didn't 404 or 405
虽然实际视图在处理过程中可能会引发404(或其他错误),但这并不能给出整体情况。最终,除非你真正向它发出请求,否则你无法真正知道路径是否合适。
答案 1 :(得分:0)
您可以使用test_client
的{{1}}方法(如果您正在使用蓝图,则使用app
)来创建临时应用程序上下文,您可以向其发送请求{{1包含响应数据的实例返回,包括响应的current_app
:
flask.wrappers.Response
因此,要找到所有返回404状态的网址,我会这样做:
status_code
答案 2 :(得分:0)
"/the/exact/rule/<instance_id>" in [rule.rule for rule in app.url_map.iter_rules()]
@pytest.fixture
def client():
from product.cli import app
app.add_url_rule('/test/<instid>', 'test',
lambda instid: b'test_resp')
with app.test_client() as client:
yield client
def test_route_map(client):
ret = client.get('/test/1')
assert ret.data == b'test_resp'