with instalar framework as_view django url rest

django - instalar - Capturando los parámetros de url en request.GET



django rest framework with django 2 (9)

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 de la url como parte del objeto HttpRequest ? My HttpRequest.GET actualmente devuelve un objeto QueryDict vacío.

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


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


Me gustaría añadir 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 una ruta de este tipo en urls.py. Lo que necesitas configurar 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, aunque

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 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"


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

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

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

Acabo de experimentarlo yo mismo; ¡Espero eso ayude!


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

  • 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 de despachador de URL capturará partes de la ruta de la URL (aquí "user/thaiyoshi/" ) y las pasará a la función de vista junto con el objeto de solicitud.

La cadena de consulta (aquí el 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:

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

Para 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 puedes usar:

key_a = request.GET[''a'']

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

v2:

Si sus llaves son opcionales:

request.GET.get(''a'')

Puedes intentarlo sin ningún argumento esto no se bloqueará. Así que puedes 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.


Utilizando GET

request.GET["id"]

Utilizando POST

request.POST["id"]


Cuando url es como: domain/search/?q=haha , entonces 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 con nombre).

Como:

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

Entonces en tus views.py tendrías

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


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