Python Django url метод regex для строки, разделенной запятыми в одинарных кавычках
Попытка выполнить regex-сопоставление строки выглядит так:
'1,2'
Используя метод Django rest framework url
для разбора входящей строки, я попробовал следующее:
url(r'^path/to/api/end_point/(?P<player_ids>"\'1,2\'")/',
PlayerResultsView.as_view(),
name='get_players)
Ошибка, которую я получаю:
django.core.urlresolvers.NoReverseMatch: Reverse for 'get_players' с аргументами '()' и ключевыми аргументами '{'player_ids': '1,2'}' не найден. найдено. Проверен 1 шаблон(ы): ['path/to/api/end_point/(?P<player_ids>"\'1,2\'")/']
.
Общая цель: передать разделенную запятыми строку ('1,2,3,4') в конечную точку REST, разделить на запятые и продолжить обработку.
Решение 1
Вы пытаетесь найти соответствие фиксированной строке 1,2
. Если вам нужен переменный ввод, будь то 1,2
или 1,2,3,4
или другие, то попробуйте этот регекс-шаблон [\d,]+
, который будет захватывать непустую строку, содержащую любые числа и запятые.
re_path(r'^path/to/api/end_point/(?P<player_ids>[\d,]+)/', views.some_view),
Примерный URL будет выглядеть так:
http://127.0.0.1:8000/path/to/api/end_point/1,2,3,4/
Решение 2
Вместо такого ввода переменных в пути, вам может быть интересно сделать их параметрами запроса. Например, что-то вроде:
path('path/to/api/end_point/', views.some_view),
Примерный URL будет выглядеть так:
http://127.0.0.1:8000/path/to/api/end_point/?player_ids=1,2,3,4
Тогда просто обратитесь к нему как к части request.GET
или request.query_params
(если используется djangorestframework
) в вашем представлении.
def some_view(request, **kwargs):
print(f"{request.GET.get('player_ids')=}")
print(f"{request.query_params.get('player_ids')=}")
Выход
request.GET.get('player_ids')='1,2,3,4'
request.query_params.get('player_ids')='1,2,3,4'
[08/Sep/2021 01:44:05] "GET path/to/api/end_point/?player_ids=1,2,3,4 HTTP/1.1" 200 17
Я решил использовать POST, проще передавать более сложные параметры.
Мой шаблон URL:
url(r'^path/to/api/end_point/',
PlayerResultsView.as_view(),
name='get_players)
Мои данные POST представляют собой массив идентификаторов игроков:
list_of_search_ids = [player1.player_id, player2.player_id]
data = {'player_ids': list_of_search_ids}
url = reverse(
"get_players"
)
resp = self.client.post(url, json.dumps(data), content_type='application/json')