如何捕获可选的GET参数django(queryparam页面有问题?)

时间:2018-05-02 23:05:27

标签: python django django-rest-framework query-string

假设有人想要GET名为Volume的实体,这是django中的模型。我暴露了一个端点:

urlpatterns = [ ... 
    path('vol', views.volume_view, name='volume query'),
    path('vol/<str:volume>', views.volume_view, name='volume specific query'),
    ... ]

并且视图volume_view有一个签名(它在GenericViewSet内):

def volume_view(self, request, volume="", format=None):
    ... 

当用户提出如下请求时,一切都很好。

requests.get("http:/.../my_app/vol")

或者,如果用户提出如下请求:

requests.get("http:/.../my_app/vol/some_prefix_here")

分别返回我当前存储的卷的用户所有和子集。但是,我想允许一些智能的,可选的选项,例如:

  • page:您想要对回复进行分页吗?
  • fromto:时间戳,用于提供范围查询。
  • prefix:搜索与此前缀匹配的任何音量。

所以我想,把它们放在request.GET标题词典中。一旦我投入了例如:

requests.get("http:/.../my_app/vol", params={"page":False})

urlpatterns找不到它!这是有道理的,因为在GET&#39;中,params作为查询字符串被附加到你的url:

当我对此运行python manage.py runserver时,我得到的没有查询字符串:

[02/May/2018 22:23:13] "GET /my_app/vol HTTP/1.1" 200 123

当我用查询字符串运行它时

Not Found: /my_app/vol
[02/May/2018 22:42:43] "GET /my_app/vol?page=False HTTP/1.1" 404 26

所以我问,处理这种情况的正确方法是什么?任何意见将不胜感激。感谢。

编辑:

Selcuk向我保证我写错了所以我挖到了manage.py shell并在/abcd网址上手动运行了一些请求,看看发生了什么:

>>> requests.get('http://lx-chmmutil02:8000/.../abcd/')
<Response [200]>
>>> requests.get('http://lx-chmmutil02:8000/.../abcd/', params={"foo":"bar"})
<Response [200]>
>>> requests.get('http://lx-chmmutil02:8000/.../abcd/', params={"page":"False"})
<Response [404]>
>>> requests.get('http://lx-chmmutil02:8000/.../abcd/', params={"boo":"True"})
<Response [200]>
>>> requests.get('http://lx-chmmutil02:8000/../abcd/', params={"boo":"False"})
<Response [200]>

任何使用包含单词页面的参数进入/ abcd /的请求都会立即死亡。在中间件或django本身的某个地方,它正在拦截关键词并爆炸。

关键字page或者我疯了吗?

如果我将关键字更改为不包含&#34; page&#34;,则可以。

我正在使用的一些东西:

  • DRF的ModelViewSet视图和volume_view = SomeViewSet.as_view({'get':'list'})
  • DRF&#39; Serializer课程。
  • DRF&#39; LimitOffsetPagination课程。

1 个答案:

答案 0 :(得分:0)

好的,问题实际上是我自己的愚蠢:

我有一个自定义分页器/权限/预处理mixin基类,它应用于我的一部分视图。这个paginator基类几乎使用了PageNumberPagination。我复制了将样板类定义粘贴到很多视图中,在我知道之前,页面参数是由该分页符在我的实际视图中捕获之前获取的。

tl; dr:当您将DRF的中间件混合到您的视图中时,请准确了解您正在混合的内容以及他们需要运行什么类型的查询内容。