不要克服在另一个函数中调用函数

Don't overcome to call function inside another one

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

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

谢谢

简答:你不能这样做。

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

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

实际上,这个 get_user_email 函数(当然,如果您发布的是完整实现)是无用的,弊大于利/可读性。