从管理命令调用视图

时间:2013-12-23 09:46:10

标签: python django httprequest

所以我在我的django应用程序中添加了一个manage.py命令,它基本上从视图中获取结果并将它们通过电子邮件发送给特定用户。此命令将在cron计划上运行 - 基本上这是通过自动电子邮件报告完成的。

我已经想出如何添加命令,但我想现在调用视图。问题是我没有HttpRequest对象,每当我在HttpRequest上阅读django文档时,我的眼睛都会茫然,我很难跟上它。我不确定如何创建一个满足我需求的HttpRequest对象,也不确定是否有另一种方法可以完成。我也尝试将'None'作为请求对象传递,但这并没有带来任何结果。

帮助?

3 个答案:

答案 0 :(得分:4)

我认为你的情况如下:

def superDuperView(request, params,...): 
   # The logic lies here which is intended to be reused.
   ......
   ......
   return HttpResponse('template.html', {somedata}) 

您希望在管理命令中重用视图的逻辑。但调用视图是没有请求响应生命周期似乎是不可能的。因此,逻辑分离和你的观点会对你有所帮助:

def superDuberBusinessLogic(user, params,...): 
   #implement your logic here without a need of any request.
   ......
   return result

你的观点将成为:

def superDuperView(request, params,...): 
   # You could pass user your logic if you need.
   data = superDuberBusinessLogic(request.user, params,....)
   return HttpResponse('template.html', {data}) 

您可以在管理命令中使用superDuberBusinessLogic

答案 1 :(得分:2)

我完全承认这种黑客性质,但是如果有效则是愚蠢的吗?

from django.test import Client

user = User.objects.filter(is_superuser=True)[0]
assert user.is_authenticated()

c = Client()
c.force_login(user)

resp = c.get( reverse('frontend:csv-view', kwargs={'company':company.name}) )
print resp.content

答案 2 :(得分:0)

如果有人遇到需要 request 对象的情况, 一个简单的解决方案可能是使用 curl 作业中的 cron 命令

这对于例如很有用。在电子邮件模板中建立绝对网址

例如

30 08 10 06 * curl http://localhost/your/view/param/etc/etc/

这绕过了对任何管理命令代码的需求。