Получение ссылки URL в запросе werkzeug - PullRequest
9 голосов
/ 29 сентября 2011

У меня есть протокол DAV, который хранит внеполосные данные в привязке URL, например, ghi в DELETE /abc.def#ghi. Сервер является приложением Flask.

Я вижу, как запрос поступает по сети через tcpdump, но когда я смотрю на объект запроса werkzeug (например, url () или base_url ()), все, что я получаю, это /abc.def. #ghi был удален.

Есть ли метод, который возвращает эту информацию, или мне нужно создать подкласс Request, чтобы обработать это самостоятельно? Если да, то есть ли пример, который я могу использовать в качестве вдохновения?

Ответы [ 3 ]

13 голосов
/ 11 февраля 2013

Из Википедии ( Идентификатор фрагмента ) (нет времени найти его в RFC):

Идентификатор фрагмента функционирует иначе, чем остальная часть URI: а именно, его обработка выполняется исключительно на стороне клиента без участия сервера

Таким образом, Flask - или любая другая инфраструктура - не имеет доступа к #ghi.

12 голосов
/ 23 октября 2011

Я столкнулся с той же проблемой.API аутентификации Facebook возвращает токен доступа за хешем, добавленным в URL перенаправления.Таким же образом, request.url Flask отбрасывает все в URL за хеш-символом.

Я также использую Flask, так что я думаю, что вы можете использовать мой обходной метод перебора, используя window.location.href из Javascript дляполучить полный URL.Затем я просто извлек необходимую часть (токен доступа), поместил ее в URL-адрес перенаправления, где я могу передать токен в качестве аргумента получающей функции представления.Вот код:

@app.route('/app_response/<response>', methods=['GET'])
def app_response_code(response):
    return '''  <script type="text/javascript">
                var token = window.location.href.split("access_token=")[1]; 
                window.location = "/app_response_token/" + token;
            </script> '''

@app.route('/app_response_token/<token>/', methods=['GET'])
def app_response_token(token):
    return token

Если вам удастся (d) сделать это в Werkzeug, мне интересно узнать, как это сделать.

3 голосов
/ 18 ноября 2014

Вы можете сделать это, используя flask.url_for с аргументом ключевого слова _anchor:

url_for('abc.def', _anchor='ghi')
...