Переменные пути Flask преобразованы в ‘None’

#python #flask #routes

#python #flask #маршруты

Вопрос:

Я создаю средство сокращения URL-адресов с помощью Flask. У меня возникли проблемы с маршрутом, преобразующим переменную пути в None в конкретном случае, но я не могу объяснить поведение.

У меня есть «сокращенный» URL-адрес с идентификатором VyFVXAR2 в моей базе данных. Чтобы перейти к истинному URL-адресу, у меня есть маршрут (ниже) для /<url_id> . Когда я перехожу к /VyFVXAR2 , я получаю url_id значение None . Что бросает меня в цикл, так это то, что /vyFVXAR2 дает мне правильное url_id значение, как /VyFVXAR3 и любой случайный набор символов.

Маршрут:

  @app.route('/<string:url_id>')
    def get(url_id):
        print(f'url_id: {url_id}')
        url = Link.get_url_by_id(url_id=url_id)

        return render_template('go.html', url=url)
 

URL возвращает:

/VyFVXAR2

url_id: None

/ljasdfo2

url_id: ljasdfo2

/VyFVXAR3

url_id: VyFVXAR3

/vyFVXAR3

url_id: vyFVXAR3

Чем можно объяснить такое поведение?

Редактировать: просто чтобы уточнить, у меня возникла проблема с получением идентификатора из URL-адреса при переходе /VyFVXAR2 . Я могу получить идентификатор из URL-адреса с любого другого адреса (примеры выше).

Дальнейшее редактирование: это проблема только с Firefox. Chrome и Edge возвращают правильный идентификатор из переменных пути.

Я думаю, что могу закрыть это не потому, что на него был дан ответ, а потому, что я больше не могу воспроизвести проблему. Просто чтобы отметить, единственное изменение, которое я внес в свой код, — это включение модуля pprint для форматирования вывода request.environ объекта. Я запускаю приложение локально, используя встроенную run функцию Flask.

request.environ прежде чем он начал работать (похоже, что Firefox /None по какой-то причине передавал URI в мое приложение):

 {'wsgi.version': (1, 0), 'wsgi.url_scheme': 'http', 'wsgi.input': <_io.BufferedReader name=1008>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'werkzeug.server.shutdown': <function WSGIRequestHandler.make_environ.<locals>.shutdown_server at 0x000001F460DEBE50>, 'SERVER_SOFTWARE': 'Werkzeug/1.0.1', 'REQUEST_METHOD': 'GET', 'SCRIPT_NAME': '', 'PATH_INFO': '/None', 'QUERY_STRING': '', 'REQUEST_URI': '/None', 'RAW_URI': '/None', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': 58610, 'SERVER_NAME': '127.0.0.1', 'SERVER_PORT': '5000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'HTTP_HOST': '127.0.0.1:5000', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0', 'HTTP_ACCEPT': 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'werkzeug.request': <Request 'http://127.0.0.1:5000/None' [GET]>}
127.0.0.1 - - [30/Dec/2020 09:20:23] "GET /None HTTP/1.1" 200 -
 

request.environ после того, как он начал работать:

 {   'HTTP_ACCEPT': 'text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'HTTP_ACCEPT_ENCODING': 'gzip, deflate',
    'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.5',
    'HTTP_CONNECTION': 'keep-alive',
    'HTTP_HOST': '127.0.0.1:5000',
    'HTTP_UPGRADE_INSECURE_REQUESTS': '1',
    'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) '
                       'Gecko/20100101 Firefox/84.0',
    'PATH_INFO': '/VyFVXAR2',
    'QUERY_STRING': '',
    'RAW_URI': '/VyFVXAR2',
    'REMOTE_ADDR': '127.0.0.1',
    'REMOTE_PORT': 63858,
    'REQUEST_METHOD': 'GET',
    'REQUEST_URI': '/VyFVXAR2',
    'SCRIPT_NAME': '',
    'SERVER_NAME': '127.0.0.1',
    'SERVER_PORT': '5000',
    'SERVER_PROTOCOL': 'HTTP/1.1',
    'SERVER_SOFTWARE': 'Werkzeug/1.0.1',
    'werkzeug.request': <Request 'http://127.0.0.1:5000/VyFVXAR2' [GET]>,
    'werkzeug.server.shutdown': <function WSGIRequestHandler.make_environ.<locals>.shutdown_server at 0x0000016FD72ABEE0>,
    'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>,
    'wsgi.input': <_io.BufferedReader name=752>,
    'wsgi.multiprocess': False,
    'wsgi.multithread': True,
    'wsgi.run_once': False,
    'wsgi.url_scheme': 'http',
    'wsgi.version': (1, 0)}
 

Комментарии:

1. Я попробовал ваш код (только с помощью инструкции print) и возврата ‘hi’, и я не смог воспроизвести проблему. Вы уверены, что все здесь правильно и воспроизводимо?

2. Я почти уверен. Проблема в том, что оператор print выводит ‘url_id: None’, когда я перехожу к /VyFVXAR2, но он возвращает правильный url_id с чем-либо еще. Это может быть проблемой с моей машиной, но это очень странно. Просто для уточнения: маршрут работает, и go.html страница визуализируется. У меня возникла проблема с получением идентификатора из URL.

3. Не могли бы вы публиковать журналы запросов в терминале при посещении URL-адреса с помощью Firefox?

4. Я отредактировал свой пост, чтобы включить вывод запроса Flask.environ. Я больше не могу воспроизвести проблему, несмотря на то, что только добавил модуль pprint для форматирования вывода этого объекта environ. Это может быть случайностью с моей стороны; Я, возможно, никогда не узнаю. Однако на данный момент он работает.