将Flask中的URL恢复为端点+参数

时间:2013-10-28 09:38:07

标签: python flask

在Flask中解析URL以检索对端点的引用以及所有参数的字典的适当方法是什么?

举一个例子,根据这条路线,我想解决'/user/nick'profile{'username': 'nick'}

@app.route('/user/<username>')
def profile(username): pass

到目前为止,根据我的研究,Flask中的所有路线都存储在app.url_map下。地图是werkzeug.routing.Map的一个实例,它有一个方法match(),原则上可以做我想要的。但是,该方法是该类的内部。

3 个答案:

答案 0 :(得分:10)

这就是我为此目的而查看url_for()并将其撤消的内容:

from flask.globals import _app_ctx_stack, _request_ctx_stack
from werkzeug.urls import url_parse

def route_from(url, method = None):
    appctx = _app_ctx_stack.top
    reqctx = _request_ctx_stack.top
    if appctx is None:
        raise RuntimeError('Attempted to match a URL without the '
                           'application context being pushed. This has to be '
                           'executed when application context is available.')

    if reqctx is not None:
        url_adapter = reqctx.url_adapter
    else:
        url_adapter = appctx.url_adapter
        if url_adapter is None:
            raise RuntimeError('Application was not able to create a URL '
                               'adapter for request independent URL matching. '
                               'You might be able to fix this by setting '
                               'the SERVER_NAME config variable.')
    parsed_url = url_parse(url)
    if parsed_url.netloc is not "" and parsed_url.netloc != url_adapter.server_name:
        raise NotFound()
    return url_adapter.match(parsed_url.path, method)

此方法的返回值是一个元组,第一个元素是端点名称,第二个元素是带参数的字典。

我没有对它进行过广泛的测试,但它在所有情况下都适用于我。

答案 1 :(得分:2)

我知道我的回答迟到了,但我遇到了同样的问题并找到了一种更简单的方法来获取它:request.view_args。例如:

在我看来:

@app.route('/user/<username>')
def profile(username): 
    return render_template("profile.html")

profile.html中:     {{request.view_args}}

访问网址http://localhost:4999/user/sam时,我会收到:{'username': u'sam'}

您还可以使用request.endpoint获取使您的观看的功能的名称。

答案 2 :(得分:0)

我重写了Miguel的实现以支持子域:

do{
    // do something
}while(condition);