Как направить запрос к определенным представлениям в соответствии с параметрами в 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)




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