Django: имитировать HTTP-запросы в оболочке

Я только что узнал, что с Rails можно смоделировать HTTP-запросы в консоли с несколькими строками кода.

Отъезд: http://37signals.com/svn/posts/3176-three-quick-rails-console-tips (раздел "Погружение в ваше приложение" ).

Есть ли аналогичный способ сделать это с Django? Было бы удобно.

Ответ 1

Как я имитирую запросы из командной строки python:

Простой способ моделирования запросов:

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

Обновление: обязательно запустите оболочку django (через manage.py shell), а не классическую оболочку python.

Обновление 2: для Django <1.10 измените первую строку на

from django.core.urlresolvers import reverse 

Ответ 2

Вы можете использовать RequestFactory, который позволяет

  • вставка пользователя в запрос

  • вставка загруженного файла в запрос

  • отправка определенных параметров в представление

Обратите внимание, что вам нужно указать и URL, и класс представления, поэтому он требует дополнительной строки кода, чем использование 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)

Чтобы установить пользователя запроса, сделайте что-то вроде my_request.user = User.objects.get(id=123) прежде чем получить ответ.

Чтобы отправить параметры в представление на основе классов, сделайте что-то вроде response = MyClasBasedView.as_view()(my_request, parameter_1, parameter_2)

Расширенный пример

Вот пример использования RequestFactory с этими вещами в сочетании

  • HTTP POST (по адр url, функциональный вид view, и словаря данных post_data)

  • file_path отдельного файла (путь к file_path, file_name и значение поля формы file_key)

  • назначение пользователя на запрос (user)

  • передача словаря kwargs из URL (url_kwargs)

SimpleUploadedFile помогает форматировать файл так, чтобы он действовал для форм.

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)

Ответ 3

(см. TL;DR; down)

Его старый вопрос, но просто добавляя ответ, если кто-то может быть заинтересован.

Хотя это может быть не лучшим (или давайте говорить Django) способом делать что-то. но вы можете попробовать сделать это.

Внутри оболочки django

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

Объяснение: Я пропустил reverse(), объяснение есть, поскольку reverse() более или менее, находит URL-адрес, связанный с функцией views.py, вы можете опустить reverse(), если хотите, и вместо этого поместить весь URL.

Например, если у вас есть приложение друзей в вашем проекте django, и вы хотите увидеть функцию list_all() (в views.py) в приложении друзей, то вы можете это сделать.

TL;DR;

>>> import requests
>>> url = 'http://localhost:8000/friends/list_all'
>>> r = requests.get(url)