我正在使用django 1.11
,我想在另一个函数中调用一个小函数。
问题出在被调用函数内部的参数上。
该功能可让您从登录用户处获取电子邮件:
def get_user_email(request):
user_email = request.user.email
return user_email
另外一个做一些事情,但是我需要提取电子邮件:
@shared_task(bind=True, time_limit=3600, soft_time_limit=3600)
def get_xls_export(self, model="", search_info="", query_params=None, **kwargs):
# Some things
# Call the previous function
user_email = get_user_email()
我必须在函数中编写哪些属性才能正确调用它?
谢谢
答案 0 :(得分:1)
简短的回答:您不能这样做。
更长的答案:在(完全没用的FWIW)get_user_email()
函数中,request
应该是当前的HTTPRequest
实例,当然它仅在视图中可用。要在celery任务中使用它,您需要将request
对象从视图传递到任务,但这也不是一个好主意(它将您的任务代码与很多事情耦合在一起)如果确实有可能(不需要确定django的HTTPRequest
如何支持序列化),则不需要并且没有业务知道,这会使测试变得更加困难,甚至可能暴露敏感数据。
此处的正确解决方案是强制调用方显式传递任务所需的信息,并且仅传递那些信息。在您的情况下,根据您使用用户电子邮件的目的以及是否可以拥有潜在的过时数据,您要传递普通电子邮件,还是传递用户的id
并从任务中重新读取模型(这可以确保在执行任务时,电子邮件是最新的。)
实际上,这个get_user_email
函数(如果您发布的是当然的完整实现)是没有用的,并且比具有良好的可读性/可读性的危害更大。