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')
Вернуться на верх