Как перехватить необязательные параметры GET django (что-то не так с страницей queryparam?) - PullRequest
0 голосов
/ 03 мая 2018

Скажем, кто-то хочет 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: вы хотите разбить ответы на страницы?
  • from и to: временные метки для запроса диапазона.
  • prefix: поиск любого тома, соответствующего этому префиксу.

Итак, я подумал, поместите их в словарь заголовков request.GET. Однажды я вставил, например:

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

Урлпаттерны не смогли его найти! Это имеет смысл, поскольку в 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

И поэтому я спрашиваю, как правильно обращаться с этой ситуацией? Любые замечания будут оценены. Спасибо.

EDIT:

Selcuk заверил меня, что я написал что-то не так, поэтому я покопался в оболочке manage.py и выполнил несколько запросов вручную по /abcd URL-адресу и посмотрел, что произошло:

>>> 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 или я схожу с ума?

Если я изменю свое ключевое слово, чтобы оно не включало "страницу", оно будет работать.

Некоторые вещи, которые я использую:

  • DRF ModelViewSet для вида и volume_view = SomeViewSet.as_view({'get':'list'}).
  • DRF Serializer класс.
  • DRF LimitOffsetPagination класс.

1 Ответ

0 голосов
/ 03 мая 2018

Хорошо, проблема была в моей собственной глупости:

У меня был пользовательский базовый класс mixin / permissions / preprocessing mixin , который применялся к подмножеству моих представлений. Этот базовый класс paginator использует PageNumberPagination в значительной степени. Я скопировал и вставил определение стандартного класса во многие просмотры, и, прежде чем я узнал об этом, параметр страницы был взят этим пагинатором, прежде чем он попал в мое реальное представление.

tl; dr: Когда вы смешиваете промежуточное программное обеспечение DRF с вашими представлениями, точно знаете, что вы смешиваете и какие параметры запроса им требуются для работы.

...