#python #django #django-rest-framework
Вопрос:
Попытка регулярного выражения сопоставить строку примерно так:
‘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: Обратный для «get_players» с аргументами «()» и аргументами ключевых слов » {«идентификаторы игроков»: «1,2»}» не найден. 1 шаблон(ы) попробовал: [‘путь/к/api/конечная точка/(?P<идентификаторы игроков>»‘1,2′»)/’]
Общая цель: передать строку, разделенную запятыми (‘1,2,3,4’), в конечную точку, разделить на запятую и продолжить обработку.
Ответ №1:
Решение 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
Комментарии:
1. Ваш ответ полезен, но я не смог заставить его работать в полной мере. В итоге я написал СООБЩЕНИЕ, в котором легче передать список Python таким образом.
Ответ №2:
Я решил пойти с ПОСТА, проще передать более сложные параметры.
Мой шаблон URL-адреса:
url(r'^path/to/api/end_point/',
PlayerResultsView.as_view(),
name='get_players)
Мои данные по ПОСТУ-это массив идентификаторов игроков:
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')