Захват параметров URL в request.GET

В настоящее время я определяю регулярные выражения для захвата параметров в URL-адресе, как описано в учебнике. Как мне получить доступ к параметрам из URL как части HttpRequest ? My HttpRequest.GET настоящее время возвращает пустой объект QueryDict .

Я хотел бы узнать, как это сделать без библиотеки, чтобы лучше узнать Django.

Когда URL-адрес подобен: domain/search/?q=haha , тогда вы будете использовать request.GET.get('q', '') .

qq параметр, а '' – значение по умолчанию, если q не найдено.

Однако, если вы вместо этого просто настраиваете URLconf , то ваши записи из regex передаются функции как аргументы (или именованные аргументы).

Такие как:

 (r'^user/(?P\w{0,50})/$', views.profile_page,), 

Тогда в вашем views.py вы бы

 def profile_page(request, username): # Rest of the method 

Чтобы разъяснить объяснение Камфлана, давайте предположим, что у вас есть

  • правило url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')
  • a во входящем запросе для http://domain/user/thaiyoshi/?message=Hi

Правило диспетчера URL-адресов будет ловить части пути URL (здесь "user/thaiyoshi/" ) и передать их функции просмотра вместе с объектом запроса.

Строка запроса (здесь message=Hi ) анализируется, и параметры сохраняются как QueryDict в request.GET . Дальнейшее сопоставление или обработка параметров HTTP GET не выполняется.

Эта функция просмотра будет использовать обе части, извлеченные из пути URL и параметра запроса:

 def profile_page(request, username=None): user = User.objects.get(username=username) message = request.GET.get('message') 

В качестве дополнительной заметки вы найдете способ запроса (в данном случае "GET" , а для представленных форм обычно "POST" ) в request.method . В некоторых случаях полезно проверить, соответствует ли он ожидаемому.

Обновление. При принятии решения о том, использовать ли URL-адрес или параметры запроса для передачи информации, может помочь следующее:

  • используйте URL-адрес для уникальной идентификации ресурсов, например /blog/post/15/ (not /blog/posts/?id=15 )
  • использовать параметры запроса для изменения способа отображения ресурса, например /blog/post/15/?show_comments=1 или /blog/posts/2008/?sort_by=date&direction=desc
  • для создания дружественных человеческих URL-адресов, избегайте использования идентификационных номеров и используйте, например, даты, категории и / или пули: /blog/post/2008/09/30/django-urls/

Использование GET

 request.GET["id"] 

Использование POST

 request.POST["id"] 
 def some_view(request, *args, **kwargs): if kwargs.get('q', None): # Do something here .. 

Я хотел бы поделиться советом, который может сэкономить вам некоторое время.
Если вы планируете использовать что-то подобное в файле urls.py :

 url(r'^(?P\w+)/$', views.profile_page,), 

В основном это означает www.example.com/ . Обязательно поместите его в конце ваших URL-записей, потому что в противном случае он подвержен конфликтам с указанными ниже URL-адресами, то есть доступ к одному из них даст вам хорошую ошибку: User matching query does not exist.

Я только что испытал это сам; Надеюсь, поможет!

Это не совсем то, что вы просили, но этот fragment полезен для управления query_strings в templates .

В ситуациях, когда у вас есть только объект request вы можете использовать request.parser_context['kwargs']['your_param']

У вас есть два общих способа сделать это, если ваш URL-адрес выглядит так:

 https://domain/method/?a=x&b=y 

v1:

Если конкретный ключ является обязательным, вы можете использовать:

 key_a = request.GET['a'] 

Это вернет значение ключа if, а Exception – если нет.

v2:

Если ваши ключи не являются обязательными:

 request.GET.get('a') 

Вы можете попробовать это без каких-либо аргументов, это не сработает. Поэтому вы можете обернуть его с помощью try: except: и return HttpResponseBadRequest() в примере. Это простой способ сделать ваш код менее сложным, не используя специальную обработку исключений.

Здесь я хотел бы добавить свой выбор. Кто-то задается вопросом, как установить путь в urls.py, например

 domain/search/?q=CA 

так что мы могли бы вызвать запрос.

Дело в том, что нет необходимости устанавливать такой маршрут в urls.py. То, что вам нужно установить, – это просто маршрут в urls.py

 urlpatterns = [ path('domain/search/', views.CityListView.as_view()), ] 

и когда вы вводите http: // имя_сервера: порт / домен / поиск /? q = CA. Часть запроса ‘? Q = CA’ будет автоматически зарезервирована в хеш-таблице, которую вы можете ссылаться, хотя

 request.GET.get('q', None). 

Вот пример (views.py)

 class CityListView(generics.ListAPIView): serializer_class = CityNameSerializer def get_queryset(self): if self.request.method == 'GET': queryset = City.objects.all() state_name = self.request.GET.get('q', None) if state_name is not None: queryset = queryset.filter(state__name=state_name) return queryset 

Кроме того, когда вы пишете строку запроса в Url

 http://servername:port/domain/search/?q=CA 

Не помещайте строку запроса в кавычки, например

 http://servername:port/domain/search/?q="CA" 
  • Как декодировать параметр URL с помощью C #?
  • Java - Как найти перенаправленный URL-адрес URL-адреса?
  • Поиск инструмента для расширения сокращенных URL-адресов
  • Как я могу добавить несколько интерактивных ссылок сразу в Microsoft Word?
  • Каково значение # в URL-адресе и как я могу это использовать?
  • Могут ли браузеры изменять URL-адреса сохраненных закладок в ответ на 301 переадресацию?
  • Как установить сервер по умолчанию для помощников URL-адресов в рельсах?
  • Получить доменное имя из заданного URL-адреса
  • Проверка наличия или отсутствия URL-адреса
  • Получить содержимое файла из URL?
  • Как выбрать URL-адрес моей Spring Boot Webapp?
  • Давайте будем гением компьютера.