Захват параметров URL в запросе. GET
448662 просмотра
10 ответа
В настоящее время я определяю регулярные выражения для захвата параметров в URL, как описано в руководстве. Как мне получить доступ к параметрам из URL как части HttpRequest
объекта? Мой в HttpRequest.GET
настоящее время возвращает пустой QueryDict
объект.
Я хотел бы научиться делать это без библиотеки, чтобы я мог лучше узнать Джанго.
Автор: sutee Источник Размещён: 22.07.2019 05:35Ответы (10)
585 плюса
Когда 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
Автор: camflan
Размещён: 29.09.2008 08:31
312 плюса
Чтобы уточнить объяснение Camflan, давайте предположим, что у вас есть
- правило
url(regex=r'^user/(?P<username>\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 для уникальной идентификации ресурсов, например
/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/
45 плюса
Используя GET
request.GET["id"]
Использование POST
request.POST["id"]
Автор: Dadaso Zanzane
Размещён: 21.01.2015 08:08
20 плюса
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
Автор: Kevin
Размещён: 18.11.2010 06:40
16 плюса
Я хотел бы поделиться советом, который может сэкономить вам время.
Если вы планируете использовать что-то подобное в своем urls.py
файле:
url(r'^(?P<username>\w+)/$', views.profile_page,),
Что в основном означает www.example.com/<username>
. Обязательно поместите его в конце ваших записей URL, потому что в противном случае, он склонен вызывать конфликты с записями URL , которые следуют ниже, то есть доступ один из них будет давать вам хорошую ошибку: User matching query does not exist.
я только что испытал это сам; Надеюсь, поможет!
13 плюса
Для ситуаций, когда у вас есть только тот request
объект, который вы можете использоватьrequest.parser_context['kwargs']['your_param']
10 плюса
У вас есть два распространенных способа сделать это, если ваш URL выглядит так:
https://domain/method/?a=x&b=y
v1:
Если конкретный ключ является обязательным, вы можете использовать:
key_a = request.GET['a']
Это вернет значение, a
если ключ существует, и исключение, если нет.
v2:
Если ваши ключи не являются обязательными:
request.GET.get('a')
Вы можете попробовать это без каких-либо аргументов, это не приведет к краху. Таким образом, вы можете обернуть его try: except:
и вернуться HttpResponseBadRequest()
в пример. Это простой способ сделать ваш код менее сложным, без использования специальной обработки исключений.
8 плюса
Это не совсем то , что вы просили, но этот фрагмент является полезным для управления query_strings
в templates
.
7 плюса
Я хотел бы добавить некоторые варианты себя, здесь. Кто-то хотел бы знать, как установить путь в urls.py, например,
domain/search/?q=CA
так что мы могли бы вызвать запрос.
Дело в том, что НЕ нужно устанавливать такой маршрут в urls.py. То, что вам нужно установить, это просто маршрут в urls.py
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
и когда вы вводите HTTP: // имя_сервера: порт / домен / поиск / д = 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"
Автор: Eric Andrews
Размещён: 06.06.2018 07:20
0 плюса
Эти запросы в настоящее время выполняются путем доступа к словарю "query_params" объекта HttpRequest.
http://myserver:port/resource/?status=1
status = request.query_params.get('status', None)
Автор: mdcg
Размещён: 22.07.2019 02:35
Вопросы из категории :
- django Использование виджетов времени / даты в Django в произвольной форме
- django Django + FCGID на Fedora Core 9 - что мне не хватает?
- django Грязные поля в джанго
- django Есть ли простой способ заполнить SlugField из CharField?
- django Захват параметров URL в запросе. GET
- django Модель limit_choices_to = {'user': user}
- url .NET - получить протокол, хост и порт
- url Это имя файла или весь URL, используемый в качестве ключа в кеше браузера?
- url URL-адрес в Erlang
- url Как я могу нормализовать URL в Python
- url Измените URL в браузере, не загружая новую страницу с помощью JavaScript
- rest Транзакции в REST?
- rest Как отлаживать RESTful сервисы?
- rest REST клиенты для Java?
- rest Разрешено ли тело объекта для запроса HTTP DELETE?
- rest Аутентификация RESTful