queryset - filter django
Django: simula peticiones HTTP en shell (3)
(Ver tldr; abajo)
Es una pregunta antigua, pero solo agrega una respuesta, en caso de que alguien pueda estar interesado.
Aunque esta podría no ser la mejor (o digamos Django) la manera de hacer las cosas. Pero puedes intentar hacerlo de esta manera.
Dentro de tu shell django
>>> import requests
>>> r = requests.get(''your_full_url_here'')
Explicación: omití el reverse()
, ya que reverse()
más o menos, encuentra el url asociado a una función views.py, puede omitir el reverse()
si lo desea, y poner el url completo en su lugar.
Por ejemplo, si tiene una aplicación de amigos en su proyecto de django y desea ver la función list_all()
(en views.py) en la aplicación de amigos, puede hacer esto.
TLDR;
>>> import requests
>>> url = ''http://localhost:8000/friends/list_all''
>>> r = requests.get(url)
Acabo de enterarme de que con Rails es posible simular solicitudes HTTP en la consola con pocas líneas de código.
Echa un vistazo a: http://37signals.com/svn/posts/3176-three-quick-rails-console-tips (sección "Sumérgete en tu aplicación").
¿Hay una manera similar de hacer eso con Django? Sería útil
Cómo simulo las solicitudes desde la línea de comando de python es:
- Utiliza la excelente biblioteca de peticiones.
- Usa la función inversa 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 django (a través de manage.py shell
), no un shell clásico de Python.
Actualización 2: Para Django <1.10, cambie la primera línea a
from django.core.urlresolvers import reverse
Puede utilizar RequestFactory
, que permite
insertar un usuario en la solicitud
insertar un archivo cargado en la solicitud
Enviando parámetros específicos a la vista.
Tenga en cuenta que debe especificar la URL y la clase de vista, por lo que requiere una línea de código adicional que el uso de requests
.
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 obtener la respuesta.
Para enviar parámetros a una vista basada en clase, haga algo como la response = MyClasBasedView.as_view()(my_request, parameter_1, parameter_2)
Ejemplo extendido
Aquí hay un ejemplo del uso de RequestFactory
con estas cosas en combinación
HTTP POST (a url
url
, vista funcional y un diccionario de datospost_data
)cargar un solo archivo (ruta
file_path
, nombrefile_name
y campo de formulario valorfile_key
)Asignar un usuario a la solicitud (
user
)pasando el diccionario kwargs desde la url (
url_kwargs
)
SimpleUploadedFile
ayuda a formatear el archivo de manera válida para los 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)