Django:在shell中模拟HTTP请求

时间:2012-08-01 09:54:48

标签: django django-shell

我刚刚了解到,使用Rails可以在控制台中用几行代码模拟HTTP请求。

结帐:http://37signals.com/svn/posts/3176-three-quick-rails-console-tips(“潜入您的应用”部分)。

使用Django有类似的方法吗?会很方便。

3 个答案:

答案 0 :(得分:25)

您可以使用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_name和表单字段值file_key

  • 将用户分配给请求(user

  • 从网址传递kwargs字典(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)

答案 1 :(得分:17)

我如何模拟来自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 shell(通过manage.py shell),而不是经典的python shell。

更新2:对于Django< 1.10,将第一行更改为

from django.core.urlresolvers import reverse 

答案 2 :(得分:2)

(见tldr; down)

这是一个老问题, 但只是添加一个答案,以防有人感兴趣。

虽然这可能不是最好的(或者说让Django)做事的方式。 但你可以尝试这样做。

在你的django shell里面

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

<强>说明: 我省略了reverse(), 解释是,因为reverse()或多或少, 找到与views.py函数关联的url, 如果您愿意,可以省略reverse(),然后改为整个网址。

例如,如果您的django项目中有朋友应用, 并且您希望在好友应用中看到list_all()(在views.py中)功能, 那么你可以这样做。

<强> TLDR;

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