Capturando parâmetros de url no request.GET

No momento, estou definindo expressões regulares para capturar parâmetros em um URL, conforme descrito no tutorial. Como faço para acessar parâmetros da url como parte do object HttpRequest ? Meu HttpRequest.GET atualmente retorna um object QueryDict vazio.

Eu gostaria de aprender como fazer isso sem uma biblioteca para que eu possa conhecer melhor o Django.

Quando url é como: domain/search/?q=haha , então você usaria request.GET.get('q', '') .

q é o parâmetro que você quer, e '' é o valor padrão se q não for encontrado.

No entanto, se você estiver apenas configurando seu URLconf , suas capturas da regex serão passadas para a function como argumentos (ou argumentos nomeados).

Tal como:

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

Então, no seu views.py você teria

 def profile_page(request, username): # Rest of the method 

Para esclarecer a explicação de camflan, vamos supor que você tenha

  • o url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page') da regra url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')
  • um pedido de input para http://domain/user/thaiyoshi/?message=Hi

A regra de dispatcher de URL capturará partes do caminho de URL (aqui "user/thaiyoshi/" ) e as transmitirá para a function de exibição junto com o object de solicitação.

A seqüência de consulta (aqui message=Hi ) é analisada e os parâmetros são armazenados como um QueryDict em request.GET . Nenhuma outra correspondência ou processamento para parâmetros HTTP GET é feito.

Essa function de visualização usaria as duas partes extraídas do caminho da URL e um parâmetro de consulta:

 def profile_page(request, username=None): user = User.objects.get(username=username) message = request.GET.get('message') 

Como uma nota lateral, você encontrará o método de solicitação (neste caso, "GET" , e para formulários enviados geralmente "POST" ) em request.method . Em alguns casos, é útil verificar se corresponde ao que você está esperando.

Atualização: Ao decidir usar o caminho de URL ou os parâmetros de consulta para passar informações, o seguinte pode ajudar:

  • use o caminho da URL para identificar resources de forma única, por exemplo /blog/post/15/ (não /blog/posts/?id=15 )
  • usar parâmetros de consulta para alterar a forma como o recurso é exibido, por exemplo, /blog/post/15/?show_comments=1 ou /blog/posts/2008/?sort_by=date&direction=desc
  • para fazer URLs amigáveis, evite usar números de ID e use, por exemplo, datas, categorias e / ou slugs: /blog/post/2008/09/30/django-urls/

Usando GET

 request.GET["id"] 

Usando o POST

 request.POST["id"] 
 def some_view(request, *args, **kwargs): if kwargs.get('q', None): # Do something here .. 

Eu gostaria de compartilhar uma dica que pode lhe poupar algum tempo.
Se você planeja usar algo assim em seu arquivo urls.py :

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

O que basicamente significa www.example.com/ . Certifique-se de colocá-lo no final de suas inputs de URL, porque, caso contrário, é propenso a causar conflitos com as inputs de URL que seguem abaixo, ou seja, acessar um deles lhe dará o erro legal: User matching query does not exist.

Eu apenas experimentei eu mesmo; espero que ajude!

Isso não é exatamente o que você pediu, mas esse snippet é útil para gerenciar query_strings em templates .

Para situações em que você só tem o object request você pode usar request.parser_context['kwargs']['your_param']

Você tem duas maneiras comuns de fazer isso no caso de sua URL se parecer com isso:

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

v1:

Se uma chave específica é obrigatória, você pode usar:

 key_a = request.GET['a'] 

Isso retornará um valor de a chave if e uma exceção, se não.

v2:

Se suas chaves são opcionais:

 request.GET.get('a') 

Você pode tentar isso sem qualquer argumento que não irá falhar. Então você pode envolvê-lo com try: except: e retornar HttpResponseBadRequest() no exemplo. Essa é uma maneira simples de tornar seu código menos complexo, sem usar o tratamento especial de exceções.

Eu gostaria de adicionar alguma opção de mim mesmo aqui. Alguém gostaria de saber como definir o caminho em urls.py, como

 domain/search/?q=CA 

para podermos invocar a consulta.

O fato é que não é necessário definir tal rota em urls.py. O que você precisa definir é apenas a rota em urls.py

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

e quando você insere http: // nome_do_servidor: porta / domínio / pesquisa /? q = CA. A parte da consulta ‘? Q = CA’ será reservada automaticamente na tabela de hash que você pode referenciar

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

Aqui está um exemplo (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 

Além disso, quando você escreve uma string de consulta no Url

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

Não coloque a string de consulta entre aspas, por exemplo

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