2016-07-20 4 views
4

У меня есть некоторые URL-адреса и вы хотите проверить, указывают ли они правило url в моем приложении Flask. Как я могу проверить это с помощью Flask?Получить функцию просмотра флэшка, которая соответствует url

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 
+0

Возможно, вас заинтересует [url_for] (http://flask.pocoo.org/docs/0.11/quickstart/#url-building). – squiguy

+0

@squiguy, 'url_for' генерирует URL-адрес от« конечной точки »и дополнительных« значений ». Я хочу взять URL-адрес и найти связанную «конечную точку», если она соответствует ей. В каком-то смысле мне нужно противопоставить 'url_for'. –

ответ

11

app.url_map хранит объект, который отображает и соответствует правилам с концами. app.view_functions отображает конечные точки для просмотра функций.

Позвоните match, чтобы соответствовать URL-адресу конечной точке и значениям. Он будет увеличивать 404, если маршрут не найден, и 405, если указан неправильный метод. Вам понадобится метод, а также соответствующий URL.

Перенаправления рассматриваются как исключения, вам нужно поймать и протестировать их рекурсивно, чтобы найти функцию просмотра.

Можно добавлять правила, которые не отображаются в соответствии с видами, вам нужно поймать 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 осуществить, как делаются спички, см документации для деталей.

Функция просмотра также может вызывать ошибки 404 (или другие), поэтому это гарантирует, что URL-адрес будет соответствовать представлению, а не то, что представление возвращает ответ 200.