Регулярное выражение метода URL Python Django для строки, разделенной запятыми, в одинарных кавычках

#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')