我正在使用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
实例,当然只能在视图中使用。要在芹菜任务中使用它,您需要将request
对象从视图传递到任务,但这也是一个坏主意(它会将您的任务代码与很多它不需要并且没有业务知道的东西耦合,这将使测试变得更加困难, 它甚至可能暴露敏感数据),如果这实际上是可能的(不确定 Django 的HTTPRequest
如何支持序列化)。
此处的正确解决方案是强制调用方显式传递任务所需的信息,并且仅传递这些信息。在您的情况下,根据您使用用户电子邮件的目的以及是否可以拥有可能过时的数据,您希望传递纯电子邮件,或者传递用户的id
并从任务中重新读取模型(这可确保电子邮件在执行任务时是最新的)。
实际上,这个get_user_email
函数(当然,如果您发布的是完整的实现)是无用的,并且比良好的 wrt/可读性危害更大。