以下是我的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 文件进行一些交互,以便将项目保存到数据库中。
答案 0 :(得分:2)
此代码
您可以使用[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请求,因此您:
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/