Захват параметров url в запросе.ПОЛУЧИТЬ

В настоящее время я определяю регулярные выражения для захвата параметров в url-адресе, как описано в учебнике. Как получить доступ к параметрам из url-адреса как часть

9 ответов


когда 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

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

  • правила 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-адреса, избегайте использования ID-номеров и используйте, например, даты, категории и / или слизни: /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 ..

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

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

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

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


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


у вас есть два общих способа сделать это в случае, если Ваш url выглядит так:

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

v1:

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

key_a = request.GET['a']

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

v2:

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

request.GET.get('a')

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


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


Я хотел бы добавить некоторый вариант себя, здесь. Кто-то будет задаваться вопросом, Как установить путь в 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

не обертывать строку запроса в кавычки e.g

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