Saltar al contenido

Django: simula solicitudes HTTP en shell

Solución:

Puedes usar RequestFactory, Que permite

  • insertar un usuario en la solicitud

  • insertar un archivo cargado en la solicitud

  • enviando parámetros específicos a la vista

y no requiere la dependencia adicional de usar solicitudes.

Tenga en cuenta que debe especificar tanto la URL como la clase de vista, por lo que se necesita una línea adicional de código que el uso de solicitudes.

from django.test import RequestFactory

request_factory = RequestFactory()
my_url="/my_full/url/here"  # Replace with your URL -- or use reverse
my_request = request_factory.get(my_url)
response = MyClasBasedView.as_view()(my_request)  # Replace with your view
response.render()
print(response)

Para configurar el usuario de la solicitud, haga algo como my_request.user = User.objects.get(id=123) antes de recibir la respuesta.

Para enviar parámetros a una vista basada en clases, haga algo como response = MyClasBasedView.as_view()(my_request, parameter_1, parameter_2)

Ejemplo extendido

Aquí hay un ejemplo de uso RequestFactory con estas cosas en combinación

  • HTTP POST (a la URL url, vista funcional viewy un diccionario de datos post_data)

  • cargando un solo archivo (ruta file_path, nombre file_namey valor del campo de formulario file_key)

  • asignar un usuario a la solicitud (user)

  • pasando el diccionario kwargs desde la url (url_kwargs)

SimpleUploadedFile ayuda a formatear el archivo de una manera que sea válida para formularios.

from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import RequestFactory

request = RequestFactory().post(url, post_data)
with open(file_path, 'rb') as file_ptr:
    request.FILES[file_key] = SimpleUploadedFile(file_name, file_ptr.read())
    file_ptr.seek(0)  # resets the file pointer after the read
    if user:
        request.user = user
    response = view(request, **url_kwargs)

Usando RequestFactory desde un shell de Python

RequestFactory nombra su servidor “servidor de pruebas” por defecto, lo que puede causar un problema si no lo está usando dentro del código de prueba. Verás un error como:

DisallowedHost: Invalid HTTP_HOST header: 'testserver'. You may need to add 'testserver' to ALLOWED_HOSTS.

Esta solución alternativa del comentario de @ boatcoder muestra cómo anular el nombre del servidor predeterminado a “localhost”:

request_factory = RequestFactory(**{"SERVER_NAME": "localhost", "wsgi.url_scheme":"https"}).

Cómo simulo solicitudes desde la línea de comando de Python es:

  • Utilice la excelente biblioteca de solicitudes
  • Usa la función inversa de django

Una forma sencilla de simular solicitudes es:

>>> from django.urls import reverse
>>> import requests
>>> r = requests.get(reverse('app.views.your_view'))
>>> r.text
(prints output)
>>> r.status_code
200

Actualización: asegúrese de iniciar el shell de django (a través de manage.py shell), no una cáscara de pitón clásica.

Actualización 2: para Django <1.10, cambie la primera línea a

from django.core.urlresolvers import reverse 

(Ver tldr; abajo)

Es una pregunta antigua, pero solo agrega una respuesta, en caso de que alguien esté interesado.

Aunque esta podría no ser la mejor (o digamos Django) forma de hacer las cosas. pero puedes intentar hacerlo de esta manera.

Dentro de tu shell de django

>>> import requests
>>> r = requests.get('your_full_url_here')

Explicación:
Omití el reverse(), la explicación es, ya que reverse() más o menos, encuentra la URL asociada a una función views.py, puede omitir la reverse() si lo desea, y coloque la URL completa en su lugar.

Por ejemplo, si tiene una aplicación de amigos en su proyecto de django y desea ver la list_all() (en views.py) en la aplicación de amigos, entonces puede hacer esto.

TLDR;

>>> import requests
>>> url="http://localhost:8000/friends/list_all"
>>> r = requests.get(url)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *