Захват параметров URL в запросе. GET - PullRequest
391 голосов
/ 30 сентября 2008

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

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

Ответы [ 9 ]

577 голосов
/ 30 сентября 2008

Когда 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
307 голосов
/ 01 октября 2008

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

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

Правило диспетчера URL будет захватывать части URL path (здесь "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/
46 голосов
/ 21 января 2015

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

request.GET["id"]

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

request.POST["id"]
20 голосов
/ 18 ноября 2010
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
16 голосов
/ 05 февраля 2013

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

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

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

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

12 голосов
/ 05 мая 2017

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

10 голосов
/ 04 октября 2017

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

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

v1:

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

key_a = request.GET['a']

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

v2:

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

request.GET.get('a')

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

8 голосов
/ 30 сентября 2008

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

6 голосов
/ 06 июня 2018

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

domain/search/?q=CA

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

Дело в том, что НЕ обязательно указывать такой маршрут в urls.py. Вам нужно указать только маршрут в urls.py

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

и при вводе http://servername:port/domain/search/?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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...