不要克服在另一个函数内部调用函数的问题

时间:2019-02-18 11:47:27

标签: python django celery

我正在使用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()

我必须在函数中编写哪些属性才能正确调用它?

谢谢

1 个答案:

答案 0 :(得分:1)

简短的回答:您不能这样做。

更长的答案:在(完全没用的FWIW)get_user_email()函数中,request应该是当前的HTTPRequest实例,当然它仅在视图中可用。要在celery任务中使用它,您需要将request对象从视图传递到任务,但这也不是一个好主意(它将您的任务代码与很多事情耦合在一起)如果确实有可能(不需要确定django的HTTPRequest如何支持序列化),则不需要并且没有业务知道,这会使测试变得更加困难,甚至可能暴露敏感数据。

此处的正确解决方案是强制调用方显式传递任务所需的信息,并且仅传递那些信息。在您的情况下,根据您使用用户电子邮件的目的以及是否可以拥有潜在的过时数据,您要传递普通电子邮件,还是传递用户的id并从任务中重新读取模型(这可以确保在执行任务时,电子邮件是最新的。)

实际上,这个get_user_email函数(如果您发布的是当然的完整实现)是没有用的,并且比具有良好的可读性/可读性的危害更大。