如何从外部python脚本调用django视图函数

时间:2015-11-17 08:42:24

标签: python django

以下是我的views.py方法的样子:

def save(request):
    if request.method == 'POST':
        post = json.loads(request.body)
        post['id'] = int(post['id'])
        post['desc'] = post['description']
        ....
        ....
    return HttpResponse(json.dumps({'message': message, 'saved_item': saved_id}))

现在我需要从django项目目录之外调用这个save方法。我相信这可以通过以某种方式导入这个views.py文件来完成,但我不确定如何提供请求作为此方法的参数。

此保存方法也会与 models.py 文件进行一些交互,以便将项目保存到数据库中。

3 个答案:

答案 0 :(得分:2)

注意

此代码

  1. 加载Django测试设施,
  2. 创建一个必须由
  3. 填写的请求样机
  4. 序列化数据,只有
  5. 视图在之后反序列化,处理它
  6. 序列化结果,您必须
  7. 提取回复
  8. 再次反序列化。
  9. 除非你为视图构建一个测试用例,否则这是一个黑客,一个丑陋的。

    您可以使用[django.test.RequestFactory][1]来实例化请求实例:

    from django.test import RequestFactory
    from myapp import save
    
    self.factory = RequestFactory()
    request = self.factory.get('/customer/details')
    request = self.factory.post('/customers/',{"name":"alfred"})
    save(request)
    

    这通常对测试非常有用。

答案 1 :(得分:2)

将我的评论发展成更详细的案例。您的观点通常如下所示:

def my_view(request):
    data = deserialize_data_from_request(request)
    result = do_something_with_data(data)
    return serialize_result_into_response(result)

我相信,您希望从项目目录之外的do_something_with_data。您有两种方法可以实现这一目标,而无需重复自己:

1)hackish方式。

您没有处理HTTP请求,因此您:

  • 启动Django测试工具
  • 创建请求样机
  • 将您的数据序列化为请求样机
  • 在请求样机上调用您的视图
    • 您的观点deserializes_data_from_request
    • 您的观点does_something_with_data
    • 您的观点serializes_result_into_response
  • 从响应中提取序列化结果
  • 反序列化结果

虽然它有效,但它绝对是愚蠢和错综复杂的。执行此操作的唯一原因是构建视图测试用例,从那时起您实际上想要测试反序列化/序列化过程。

见塞巴斯蒂安·沃兹尼的答案。

2)干净的方式。

从视图中提取任务。以这种方式更改视图模块:

def my_save_function(data):
    return do_something_with_data(data)

def my_view(request):
    data = deserialize_data_from_request(request)
    result = my_save_function(data)
    return serialize_result_into_response(result)

现在,您可以从外部代码直接调用my_save_function。无需加载Django测试工具。无需多次序列化/反序列化您的数据。

答案 2 :(得分:1)

您可以照常运行服务器。从您的其他python程序,对此视图执行HTTP((POST)请求。

我推荐这个库,它真的很容易使用: http://docs.python-requests.org/en/latest/