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)