Вопрос

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

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

Это было полезно?

Решение

Когда 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-адреса удобными для пользователя, избегайте использования идентификационных номеров и используйте, напримердаты, категории и / или слагаемые: /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<username>\w+)/$', views.profile_page,),

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

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

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

У вас есть два распространенных способа сделать это на случай, если ваш URL выглядит следующим образом:

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

v1:

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

key_a = request.GET['a']

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

v2:

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

request.GET.get('a')

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

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

Я хотел бы добавить здесь кое-что от себя.Кто-то мог бы задаться вопросом, как задать путь в 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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top