23

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

查看:http: //37signals.com/svn/posts/3176-three-quick-rails-console-tips(“深入了解您的应用程序”部分)。

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

4

3 回答 3

43

您可以使用RequestFactory,它允许

  • 将用户插入请求

  • 将上传的文件插入到请求中

  • 向视图发送特定参数

并且不需要使用requests的额外依赖。

请注意,您必须同时指定 URL 和视图类,因此与使用请求相比,它需要多行代码。

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)

  • url_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)

在 Python shell 中使用 RequestFactory

RequestFactory默认情况下将您的服务器命名为“testserver”,如果您不在测试代码中使用它,这可能会导致问题。您会看到如下错误:

DisallowedHost: Invalid HTTP_HOST header: 'testserver'. You may need to add 'testserver' to ALLOWED_HOSTS.

@boatcoder 评论中的这个解决方法显示了如何将默认服务器名称覆盖为“localhost”:

request_factory = RequestFactory(**{"SERVER_NAME": "localhost", "wsgi.url_scheme":"https"}).
于 2016-07-26T17:44:13.000 回答
20

我如何模拟来自 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 
于 2012-08-01T10:06:21.910 回答
5

(参见 tldr;向下)

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

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

在你的 django shell 里面

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

说明: 我省略了reverse(), 说明,因为reverse()或多或少会找到与 views.py 函数关联的 url,reverse()如果您愿意,可以省略 ,并放置整个 url。

例如,如果您的 django 项目中有一个朋友应用程序,并且您想在朋友应用程序中查看list_all()(在 views.py 中)功能,那么您可以这样做。

TLDR;

>>> import requests
>>> url = 'http://localhost:8000/friends/list_all'
>>> r = requests.get(url)
于 2014-09-26T17:15:34.887 回答