如何捕获可选的 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 用户 所有 我当前存储的卷,以及一个子集,分别。但是,我想允许一些智能的、可选的选项,例如:
page
:您要对回复进行分页吗?
from
和 to
:给出 运行ge 查询的时间戳。
prefix
: 搜索匹配此前缀的任何卷。
所以我想,把它们放在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",它会起作用。
我正在使用的一些东西:
- DRF 的
ModelViewSet
用于视图,volume_view = SomeViewSet.as_view({'get':'list'})
。
- DRF 的
Serializer
class.
- DRF 的
LimitOffsetPagination
class.
好吧,问题实际上是我自己的愚蠢:
我有一个 自定义 paginator/permissions/preprocessing 混合基础 class 应用于我的部分视图。这个分页器基础 class 几乎使用了 PageNumberPagination。我将样板文件 class 定义复制粘贴到很多视图中,在我知道页面参数之前,它已被该分页器获取,然后才被我的实际视图捕获。
tl;dr:当你将 DRF 的中间件混合到你的视图中时,确切地知道你在混合什么以及它们需要什么样的查询参数来运行。
假设有人想要 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 用户 所有 我当前存储的卷,以及一个子集,分别。但是,我想允许一些智能的、可选的选项,例如:
page
:您要对回复进行分页吗?from
和to
:给出 运行ge 查询的时间戳。prefix
: 搜索匹配此前缀的任何卷。
所以我想,把它们放在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",它会起作用。
我正在使用的一些东西:
- DRF 的
ModelViewSet
用于视图,volume_view = SomeViewSet.as_view({'get':'list'})
。 - DRF 的
Serializer
class. - DRF 的
LimitOffsetPagination
class.
好吧,问题实际上是我自己的愚蠢:
我有一个 自定义 paginator/permissions/preprocessing 混合基础 class 应用于我的部分视图。这个分页器基础 class 几乎使用了 PageNumberPagination。我将样板文件 class 定义复制粘贴到很多视图中,在我知道页面参数之前,它已被该分页器获取,然后才被我的实际视图捕获。
tl;dr:当你将 DRF 的中间件混合到你的视图中时,确切地知道你在混合什么以及它们需要什么样的查询参数来运行。