Как получить 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)