Captura de parámetros de URL en request.GET
Pregunta
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.
Solución
Cuando url es como: domain/search/?q=haha
Entonces usarías request.GET.get('q', '')
.
q
es el parámetro que desea, y ''
es el valor predeterminado si no se encuentra URLconf
.
Sin embargo, si en cambio solo está configurando su regex
, sus capturas de views.py
se pasan a la función como argumentos (o argumentos con nombre).
Tales como:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
Entonces en tu <=> tendrías
def profile_page(request, username):
# Rest of the method
Otros consejos
Para aclarar la explicación de camflan, supongamos que tiene
- la regla
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- a en la solicitud entrante de
http://domain/user/thaiyoshi/?message=Hi
La regla del despachador de URL capturará partes de la URL ruta (aquí "user/thaiyoshi/"
) y las pasará a la función de visualización 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 coincidencia o procesamiento adicional 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 espera.
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.
/blog/post/15/
(no/blog/posts/?id=15
) - use 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 usar números de identificación y use p. fechas, categorías y / o babosas:
/blog/post/2008/09/30/django-urls/
Uso de GET
request.GET["id"]
Uso de 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<username>\w+)/
Lo que básicamente significa
www.example.com/<username>
. Asegúrese de colocarlo al final de sus entradas de URL, porque de lo contrario, es probable que cause conflictos con las entradas de URL que siguen a continuación, es decir, acceder a una de ellas le dará el buen error: < code> La consulta de coincidencia del usuario no existe.
Lo acabo de experimentar yo mismo; ¡espero que ayude! , views.profile_page,),
Lo que básicamente significa www.example.com/<username>
. Asegúrese de colocarlo al final de sus entradas de URL, porque de lo contrario, es probable que cause conflictos con las entradas de URL que siguen a continuación, es decir, acceder a una de ellas le dará el buen error: < code> La consulta de coincidencia del usuario no existe.
Lo acabo de experimentar yo mismo; ¡espero que ayude!
Para situaciones en las que solo tiene el objeto request
, puede usar request.parser_context['kwargs'font>['your_param'font>
Tiene dos formas comunes de hacerlo en caso de que su URL se vea así:
https://domain/method/?a=x&b=y
v1:
Si una clave específica es obligatoria, puede usar:
key_a = request.GET['a']
Esto devolverá un valor de a
si la clave existe y una excepción si no.
v2:
Si sus claves son opcionales:
request.GET.get('a')
Puede intentarlo sin ningún argumento, esto no se bloqueará.
Por lo tanto, puede envolverlo con try: except:
y devolver HttpResponseBadRequest ()
, por ejemplo.
Esta es una manera simple de hacer que su código sea menos complejo, sin usar el manejo de Excepciones especiales.
Esto no es exactamente lo que solicitó, pero este fragmento es útil para administrar < code> query_strings en templates
.
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 ingresa 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 escribe una cadena de consulta en la 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"