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

How to capture optional GET parameters django (something wrong with queryparam page?)

假设有人想要 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")

其中 returns 用户 所有 我当前存储的卷,以及一个子集,分别。但是,我想允许一些智能的、可选的选项,例如:

所以我想,把它们放在request.GET header字典里。例如,一旦我输入:

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

url模式没找到!这是有道理的,因为在 GET 中,参数作为查询字符串附加到您的 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 向我保证我写错了,所以我在 /abcd url 上手动挖掘了 manage.py shell 和 运行 一些请求,看看发生了什么:

>>> 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/ 且参数包含单词 page 的请求都会立即终止。在中间件或 django 本身的某个地方,它正在拦截该关键字并爆炸。

关键字 page 是不是出了什么问题,还是我要疯了?

如果我将关键字更改为不包含 "page",它会起作用。

我正在使用的一些东西:

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

我有一个 自定义 paginator/permissions/preprocessing 混合基础 class 应用于我的部分视图。这个分页器基础 class 几乎使用了 PageNumberPagination。我将样板文件 class 定义复制粘贴到很多视图中,在我知道页面参数之前,它已被该分页器获取,然后才被我的实际视图捕获。

tl;dr:当你将 DRF 的中间件混合到你的视图中时,确切地知道你在混合什么以及它们需要什么样的查询参数来运行。