获取与网址匹配的Flask视图功能

时间:2016-07-20 18:26:07

标签: python flask werkzeug

我有一些网址路径,想检查他们是否指向我的Flask应用中的网址规则。如何使用Flask进行检查?

from flask import Flask, json, request, Response

app = Flask('simple_app')

@app.route('/foo/<bar_id>', methods=['GET'])
def foo_bar_id(bar_id):
    if request.method == 'GET':
        return Response(json.dumps({'foo': bar_id}), status=200)

@app.route('/bar', methods=['GET'])
def bar():
    if request.method == 'GET':
        return Response(json.dumps(['bar']), status=200)
test_route_a = '/foo/1'  # return foo_bar_id function
test_route_b = '/bar'  # return bar function

2 个答案:

答案 0 :(得分:17)

app.url_map存储使用端点映射和匹配规则的对象。 app.view_functions映射端点以查看函数。

调用match以匹配端点和值的网址。如果找不到路由,它将引发404;如果指定了错误的方法,则引发405。您需要该方法以及匹配的网址。

重定向被视为异常,您需要以递归方式捕获并测试这些异常以查找视图函数。

可以添加不会映射到视图的规则,在查看视图时,您需要抓住KeyError

from werkzeug.routing import RequestRedirect, MethodNotAllowed, NotFound

def get_view_function(url, method='GET'):
    """Match a url and return the view and arguments
    it will be called with, or None if there is no view.
    """

    adapter = app.url_map.bind('localhost')

    try:
        match = adapter.match(url, method=method)
    except RequestRedirect as e:
        # recursively match redirects
        return get_view_function(e.new_url, method)
    except (MethodNotAllowed, NotFound):
        # no match
        return None

    try:
        # return the view function and arguments
        return app.view_functions[match[0]], match[1]
    except KeyError:
        # no view is associated with the endpoint
        return None

可以将更多选项传递给bind以影响匹配方式,请参阅文档了解详情。

view函数也可能引发404(或其他)错误,因此这只能保证url与视图匹配,而不是视图返回200响应。

答案 1 :(得分:0)

除了@davidism 的回答(flask 的核心开发者)。 注意,如果你想发现flask app处理的当前url的视图函数。您可以使用烧瓶的 Request 对象:

<块引用>

Flask 中默认使用的请求对象。记得 匹配的端点和视图参数。

Flask.view_functtions

<块引用>

#:将端点名称映射到视图函数的字典。 #: 要注册视图函数,请使用 :meth:route 装饰器。

 def get_view_function():
     if request.url_rule:
        return current_app.view_functions.get(request.url_rule.endpoint, None)