2008-09-29 44 views
314

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.Captura de parámetros de url en request.GET

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

Respuesta

482

Si su url es algo así como domain/search/?q=haha, entonces usted usaría request.GET.get('q', '').

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

Si solo está configurando su URLconf, entonces sus capturas del regex se pasan a la función como argumentos (o argumentos nombrados).

Tales como:

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

Luego, en su views.py tendría

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

¿Es '? Param =' la única forma en que Django reconoce los parámetros? ¿Hay alguna forma de usar URLconf con HTTP.GET? Me gustaría hacer/param/2. – sutee

+3

Compruebe la segunda parte de mi respuesta con respecto a su URLconf y las capturas de expresiones regulares. – camflan

+1

Ok. Actualmente estoy usando el segundo método. Parece que son mecanismos separados, y estoy tratando de mezclarlos. ¡Gracias! – sutee

8

Esto no es exactamente lo que pidieron, pero this snippet es útil para la gestión de query_strings en templates.

268

Para aclarar la explicación de camflan, vamos a suponer que usted tiene

  • la regla url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • una de las peticiones entrantes para la regla despachador http://domain/user/thaiyoshi/?message=Hi

La URL cogerá partes de la URL ruta (aquí "user/thaiyoshi/") y pasarlos 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 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, se encuentra el método de la petición (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: la hora de decidir si se debe utilizar la ruta URL, o los parámetros de consulta para la transmisión de información, lo siguiente puede ayudar:

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

Esta es una respuesta realmente bien escrita. Seguro que me ayudó a entender a Django un poco mejor. – Mark

+2

cómo podemos obtener todos los valores de parámetros sin mencionar los nombres – numerah

+0

@numerah request.GET es un diccionario de Python. Puede, por ejemplo,iterar a través de request.GET.items(). – akaihola

17
def some_view(request, *args, **kwargs): 
    if kwargs.get('q', None): 
     # Do something here .. 
12

me gustaría compartir una sugerencia que puede ahorrar algo de tiempo.
Si tiene previsto utilizar algo como esto en su archivo urls.py:

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

Lo que significa básicamente www.example.com/<username>. Asegúrese de colocarlo al final de sus entradas de URL, porque de lo contrario, es propenso a causar conflictos con las entradas de URL que se muestran a continuación, es decir, al acceder a una de ellas le dará el bonito error: User matching query does not exist.

I ' solo lo he experimentado yo mismo; ¡Espero eso ayude!

+2

Además, en este caso, es posible que desee verificar que los nombres de usuario no colisionen con otras direcciones URL. – DrKaoliN

34

utilizando GET

request.GET["id"] 

El uso de la POST

request.POST["id"] 
+12

Mientras esto funciona para claves existentes, las respuestas de camflan y akaihola han usado .get() para evitar excepciones 'KeyError' en el caso de una clave faltante. Sería conveniente hacer lo mismo (por ejemplo, 'request.POST.get ('id', '')'). – vastlysuperiorman

3

Para situaciones en las que sólo tiene el objeto request puede utilizar request.parser_context['kwargs']['your_param']

+0

Suponiendo que se está utilizando django-rest-framework, la pregunta específicamente pregunta sobre el uso exclusivo de las características principales. – anddam

+0

¿Estás seguro de esto? Puedo verificar esto más tarde, pero creo que me refería al uso del objeto de solicitud admitido a través de las funciones principales. –

+0

Literalmente de la pregunta original: "Me gustaría aprender cómo hacer esto sin una biblioteca" – anddam

1

Usted tiene dos formas comunes de hacer que, en caso de que su url se ve así:

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

v1:

Si tecla específica es obligatorio que puede utilizar:

key_a = request.GET['a'] 

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

v2:

Si las llaves son opcionales:

request.GET.get('a') 

Usted puede tratar de que sin ningún argumento de que esto no se bloqueará. Para que pueda envolverlo con try: except: y devolver HttpResponseBadRequest() en el ejemplo. Esta es una manera simple de hacer que su código sea menos complejo, sin usar el manejo especial de Excepciones.