Captura de parámetros de URL en request.GET

Actualmente estoy definiendo expresiones regulares para capturar parámetros en una url, como se describe en el tutorial. ¿Cómo accedo a los parámetros desde la url como parte del objeto HttpRequest ? Mi HttpRequest.GET actualmente devuelve un objeto QueryDict vacío.

Me gustaría aprender cómo hacer esto sin una biblioteca para poder conocer mejor a Django.

Cuando url es como: domain/search/?q=haha , entonces usaría request.GET.get('q', '') .

q es el parámetro que desea, Y '' es el valor predeterminado si q no se encuentra.

Sin embargo, si en su lugar solo está configurando su URLconf , entonces sus capturas de la regex se pasan a la función como argumentos (o argumentos nombrados).

Como:

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

Luego en su views.py tendrías

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

Para aclarar la explicación de camflan, supongamos que tienes

  • la url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page') la regla url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')
  • a en la solicitud entrante para http://domain/user/thaiyoshi/?message=Hi

La regla de despachador de URL capturará partes de la ruta de URL (aquí "user/thaiyoshi/" ) y las pasará a la función de vista junto con el objeto de solicitud.

La cadena de consulta (aquí message=Hi ) se analiza y los parámetros se almacenan como un QueryDict en request.GET . No se realiza ninguna otra coincidencia o procesamiento para los parámetros HTTP GET.

Esta función de vista usaría ambas partes extraídas de la ruta URL y un parámetro de consulta:

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

Como nota al margen, encontrará el método de solicitud (en este caso, "GET" , y para los formularios enviados, generalmente "POST" ) en request.method . En algunos casos, es útil verificar que coincida con lo que está esperando.

Actualización: al decidir si usar la ruta URL o los parámetros de consulta para pasar información, lo siguiente puede ayudar:

  • utilice la ruta URL para identificar recursos de forma exclusiva, p. ej. /blog/post/15/ (not /blog/posts/?id=15 )
  • utilizar parámetros de consulta para cambiar la forma en que se muestra el recurso, p. ej. /blog/post/15/?show_comments=1 o /blog/posts/2008/?sort_by=date&direction=desc
  • para hacer URL amigables para los humanos, evitar el uso de números de identificación y usar, por ejemplo, fechas, categorías y / o babosas: /blog/post/2008/09/30/django-urls/

Usando GET

 request.GET["id"] 

Usando POST

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

Me gustaría compartir un consejo que puede ahorrarle algo de tiempo.
Si planea usar algo como esto en su archivo urls.py :

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

Lo que básicamente significa www.example.com/ . Asegúrese de colocarlo al final de las entradas de su URL porque, de lo contrario, es probable que cause conflictos con las entradas de URL que se muestran a continuación, es decir, acceder a una de ellas le dará un buen error: User matching query does not exist.

Acabo de experimentarlo yo mismo; ¡Espero eso ayude!

Esto no es exactamente lo que solicitó, pero este fragmento es útil para administrar query_strings en las templates .

Para las situaciones en las que solo tiene el objeto de request , puede usar request.parser_context['kwargs']['your_param']

Tienes dos formas comunes de hacerlo en caso de que tu url se vea así:

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

v1:

Si la clave específica es obligatoria, puede usar:

 key_a = request.GET['a'] 

Esto devolverá un valor de a clave si existe y una excepción si no.

v2:

Si tus llaves son opcionales:

 request.GET.get('a') 

Puedes probar eso sin ningún argumento, esto no se bloqueará. Entonces puede envolverlo con try: except: y devolver HttpResponseBadRequest() en el ejemplo. Esta es una forma sencilla de hacer que su código sea menos complejo, sin utilizar el manejo especial de Excepciones.

Me gustaría agregar alguna opción de mí mismo, aquí. Alguien se preguntaría cómo establecer la ruta en urls.py, como

 domain/search/?q=CA 

para que podamos invocar la consulta.

El hecho es que NO es necesario establecer dicha ruta en urls.py. Lo que necesita establecer es solo la ruta en urls.py

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

y cuando ingresas http: // servername: port / domain / search /? q = CA. La parte de consulta ‘? Q = CA’ se reservará automáticamente en la tabla hash a la que puede hacer referencia

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

Aquí hay un ejemplo (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 

Además, cuando escribes cadena de consulta en Url

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

No ajuste la cadena de consulta entre comillas, por ejemplo

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