如何在 Django 中将查询参数动态设置为 request.GET

Sat*_*dra 8 python django http request

概述


带有查询参数的 url 看起来像。

http://example.api.com/search/?name=jhon&age=26
Run Code Online (Sandbox Code Playgroud)

如果我使用django-filter,所有参数都会自动从请求中提取,并且它会返回一个过滤后的查询集。

视图.py

class SearchView(TemplateView):
   template_name = "search.html"

   def get_queryset(self):
       return SearchFilter(request.GET, queryset=Model.objects.all()).qs

   def get_context_data(self, **kwargs):
      context = super(SearchView, self).get_context_data(**kwargs)
      return context
Run Code Online (Sandbox Code Playgroud)

如果我想从 request.GET 手动提取它,我可以做到。

def get_queryset(self):
   # extracting query parameter 
   q = self.request.GET.get('name')
Run Code Online (Sandbox Code Playgroud)

问题陈述


我的搜索网址看起来像

 http://example.api.com/search/jhon-26
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我不想向公众透露诸如“姓名”和“年龄”之类的键,这是为了安全抽象,这些是我的数据库表的列。

我正在进入jhon-26**kwargs,我想将其拆分并设置为 request.GET 的查询参数,以便我的过滤器类可以正常工作


有什么可以设置 request.GET 属性的吗?

# may be any set function available for this
self.request.GET.set('name', 'jhon')
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点。

Sat*_*dra 17

我在这里找到了将查询参数设置为 request.GET 的解决方案

由于 request.GET QueryDict 实例是不可变的,所以我们不能直接修改它,因此我们需要将其 _mutable 属性设置为 True

if not request.GET._mutable:
   request.GET._mutable = True

# now you can edit it
request.GET['name'] = 'jhon'
request.GET['age'] = 26
Run Code Online (Sandbox Code Playgroud)

  • 这绝对不是推荐的方法。使用 request.GET = request.GET.copy() 然后向此 request.GET['name'] = 'jhon' 添加属性是一个更安全的解决方案。正如链接解决方案中评价最高的答案所述,“这是经过专门设计的,因此不允许任何应用程序组件编辑源请求数据” (3认同)