是否可以检查发送给Flask的网址是否为404?

时间:2015-03-04 17:53:13

标签: python flask

我有一个网址列表,需要找到所有不会去找Flask的404找不到网页的网址。有没有办法检查这个?

3 个答案:

答案 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)

  1. 我尝试测试烧瓶app.url_map中是否存在确切的规则:
"/the/exact/rule/<instance_id>" in [rule.rule for rule in app.url_map.iter_rules()]
  1. 测试uri时是否可以访问:
  • 使用http连接(浏览器,curl,httpie,邮递员等)打开
  • 使用pytest:
@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'