#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. Это может быть случайностью с моей стороны; Я, возможно, никогда не узнаю. Однако на данный момент он работает.