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

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

Я хотел бы узнать, как это сделать без библиотеки, чтобы я мог лучше узнать Джанго.

вопрос задан 29.09.2008
sutee
4466 репутация

9 ответов


  • 526 рейтинг

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

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

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

    Таких как:

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

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

    def profile_page(request, username):
        # Rest of the method
    
    ответ дан camflan, с репутацией 10593, 29.09.2008
  • 284 рейтинг

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

    • правило url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')
    • во входящем запросе на 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-путь для уникальной идентификации ресурсов, e. г. /blog/post/15/ (не /blog/posts/?id=15)
    • использовать параметры запроса для изменения способа отображения ресурса, e. г. /blog/post/15/?show_comments=1 или /blog/posts/2008/?sort_by=date&direction=desc
    • , чтобы сделать удобные для пользователя URL-адреса, избегайте использования идентификационных номеров и используйте e. г. даты, категории и / или слизни: /blog/post/2008/09/30/django-urls/
    ответ дан akaihola, с репутацией 19787, 1.10.2008
  • 41 рейтинг

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

    request.GET["id"]
    

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

    request.POST["id"]
    
    ответ дан Dadaso Zanzane, с репутацией 3641, 21.01.2015
  • 19 рейтинг
    def some_view(request, *args, **kwargs):
        if kwargs.get('q', None):
            # Do something here ..
    
    ответ дан Kevin, с репутацией 191, 18.11.2010
  • 13 рейтинг

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

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

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

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

    ответ дан DrKaoliN, с репутацией 841, 5.02.2013
  • 8 рейтинг

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

    ответ дан jamting, с репутацией 1230, 30.09.2008
  • 6 рейтинг

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

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

    v1:

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

    key_a = request.GET['a']
    

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

    v2:

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

    request.GET.get('a')
    

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

    ответ дан Bartłomiej Pasek, с репутацией 119, 4.10.2017
  • 5 рейтинг

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

    ответ дан Ole Henrik Skogstrøm, с репутацией 3612, 5.05.2017
  • 2 рейтинг

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

    domain/search/?q=CA
    

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

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

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

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

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

    Вот пример (просмотров. 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
    

    Не заключать строку запроса в кавычки e. г

    http://servername:port/domain/search/?q="CA"
    
    ответ дан Eric Andrews, с репутацией 54, 6.06.2018