Как получить url-параметры из объекта HttpRequest

Предположим, у нас есть путь url:

path('something/<int:some_param>/test/', views.some_view)

Когда пользователь переходит по этому url, django создает экземпляр HttpRequest, который будет передан в представление some_view. Есть ли способ получить параметр some_param url из объекта запроса вне кода some_view? (например, для выполнения некоторой обработки, которая зависит от some_param в пользовательском промежуточном ПО).


Одним из возможных решений является разбор атрибута HttpRequest.path, но есть ли какой-нибудь готовый способ сделать это?

Django вызывает ваше представление с объектом запроса и some_param, доступ к которому вы имеете внутри views.some_view. Ваша функция будет иметь следующую сигнатуру:

def some_view(request, some_param):
    ....

Ор:

def some_view(request, **kwargs):
    some_param=kwargs.get('some_param', None)

Затем вы можете использовать some_param внутри вашего представления, чтобы сделать с ним все, что вам нужно, сохранить его в базе данных, поместить в cookie, произвести с ним вычисления, получить с его помощью данные из базы данных и т.д. Затем, когда вы закончите, вам нужно вернуть объект ответа. Обычно для этого вызывается render или TemplateResponse с шаблоном или возвращается HttpResponse без шаблона. Вы отображаете шаблоны, предоставляя словарь context, в который вы можете поместить все, что вам нравится (например, some_param), что делает его доступным для отображения в вашем HTML-шаблоне. Этот отрисованный HTML-шаблон затем возвращается в качестве ответа пользователю с помощью волшебной функции render или класса TemplateResponse, что завершает процесс просмотра. Например, так:

return TemplateResponse(request, 'template.html', context)

Чтобы хранить some_param между представлениями, вам нужно сохранить его в базе данных, сохранить в сессии пользователя или использовать cookie. Или передать его следующему представлению внутри url или вне url через /?param=some_param. Не сказав, что вам нужно some_param для дальнейшего использования, трудно решить ваш вопрос.

Одним из возможных решений здесь является использование функции resolve из модуля django.urls. Она очень полезна, если вы хотите получить доступ к параметрам URL из пути URL, который связан с объектом HttpRequest вне функции представления. Например, получить параметры URL и обработать их в пользовательском промежуточном ПО или в других частях вашего кода.

Пример:

from django.urls import resolve

...

func, args, kwargs = resolve(some_request.path)

Вернуться на верх