如何根据Django中的参数将请求路由到特定的视图



我用Django创建了一个API,并试图将请求路由到不同的视图以实现优化。

以下是我要做的:如果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?

编辑:我不能直接在视图中处理这个逻辑,因为我想用不同的TTL缓存这两个查询。示例:

@cache_page(1.5)
def sales(request):
...

@cache_page(10)
def large_sales(request):
...
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:(

您可以编写一个访问请求的视图。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)



最新更新