我刚刚了解到,使用Rails可以在控制台中用几行代码模拟HTTP请求。
结帐:http://37signals.com/svn/posts/3176-three-quick-rails-console-tips(“潜入您的应用”部分)。
使用Django有类似的方法吗?会很方便。
答案 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)