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

313

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

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

Теги:
rest
url

8 ответов

479
Лучший ответ

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

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

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

Например:

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

Тогда в вашем views.py у вас будет

def profile_page(request, username):
    # Rest of the method
  • 9
    Является ли '? Param =' единственным способом, которым Django распознает параметры? Есть ли способ использовать URLconf с HTTP.GET? Я хотел бы сделать / param / 2.
  • 3
    Посмотрите вторую часть моего ответа, касающуюся ваших URLconf и регулярных выражений.
Показать ещё 6 комментариев
246

Чтобы пояснить пояснение camflan, предположим, что у вас есть

  • правило url(regex=r'^user/(?P<username>\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/ (не /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/
  • 13
    Это действительно хорошо написанный ответ. Это, конечно, помогло мне понять Джанго немного лучше.
  • 2
    как мы можем получить все значения параметров без упоминания имен
Показать ещё 3 комментария
32

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

request.GET["id"]

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

request.POST["id"]
  • 18
    Хотя это работает для существующих ключей, ответы camflan и akaihola использовали .get (), чтобы избежать исключений KeyError в случае отсутствия ключа. Было бы разумно сделать то же самое (например, request.POST.get('id', '') ).
17
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
12

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

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

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

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

  • 2
    Кроме того, в этом случае вы можете проверить, не совпадают ли имена пользователей с другими URL-адресами.
8

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

1

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

  • 0
    Я думаю, что это специфично для Django Rest Framework
0

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

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

v1:

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

key_a = request.GET['a']

Это вернет значение a, если ключ существует, и исключение, если нет.

v2:

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

request.GET.get('a')

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

  • 0
    Как я могу определить параметр запроса из шаблона?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню