Как направить запрос к определенным представлениям в соответствии с параметрами в Django?
Я создал API с помощью Django и пытаюсь направить запросы к различным представлениям в целях оптимизации.
Вот что я пытаюсь сделать: если GET запрос имеет вид 127.0.0.1:8000/api/sales/?key=<KEY>&some_query=<some_value>&..., то этот запрос должен быть обработан представлением под названием sales. Если GET запрос содержит специфический параметр sale_value, то запрос должен быть направлен в другое представление large_sales, например 127.0.0.1:8000/api/sales/?key=<KEY>&sale_value=<INT>... должен быть обработан из представления large_sales.
Вот что я пробовал:
urlpatterns = [
path('sales/', views.sales, name="sales"),
path('sales/sale_value<int:num>', views.large_sales, name="large_sales"),
]
Это направит все запросы на sales. Как я могу это сделать? Может быть, с помощью regex?
def sales(request):
try:
sale_value = request.GET['sale_value']
except:
return redirect(large_sales, num=11) # replace 11 with your number.
или попытайтесь использовать условие if (if sale_value != None:)
Вы можете написать представление, которое получает доступ к request.GET и перенаправляет соответствующим образом.
Вам также может понадобиться поместить защитный код в представление, на которое вы перенаправляете, чтобы убедиться, что пользователь (или аттакер) не проявляет изобретательность с совершенно небезопасными GET-параметрами!
При использовании представления на основе класса можно получить подкласс...
class SalesView( some_CBV_class):
...
def get( self, request, *args, **kwargs):
if request.GET.get( 'sale_value', None):
target = reverse('app:large_sales', kwargs={...}
) + '?' + request.GET.urlencode()
return HttpResponseRedirect( target)
return super().get( request, *args, **kwargs)
и для безопасности, возможно
class LargeSalesView( ...)
def get( self, request, *args, **kwargs):
if request.GET.get( 'sale_value', None) is None
target = reverse('app:sales', kwargs={...}
) + '?' + request.GET.urlencode()
return HttpResponseRedirect( target)
return super().get( request, *args, **kwargs)