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.

¿Fue útil?

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"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top