Django的:模拟在外壳的HTTP请求(Django: simulate HTTP request

2019-07-30 17:27发布

我刚刚得知,使用Rails可以模拟在几行代码控制台的HTTP请求。

退房: http://37signals.com/svn/posts/3176-three-quick-rails-console-tips (节“潜入你的应用程序”)。

有没有类似的方式来做到这一点与Django的? 将方便。

Answer 1:

我如何模拟从Python的命令行的请求是:

  • 使用优秀的请求库
  • 使用Django的反转功能

模拟请求的一种简单方法是:

>>> 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 


Answer 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 url ,功能视图view ,以及数据字典post_data

  • 上传的单个文件(路径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)


Answer 3:

(参见tldr;下)

一个老问题,但只是增加一个答案,万一有人可能有兴趣。

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

里面你的Django壳

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

说明:我省略了reverse()解释之中,因为reverse()或多或少,发现关联到views.py功能的网址,你可以省略reverse()如果你想,并把整个URL来代替。

例如,如果你有一个朋友app,你Django项目,并希望看到list_all()在views.py)函数在朋友的应用程序,那么你就可以做到这一点。

TLDR;

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


文章来源: Django: simulate HTTP requests in shell