如何在shell和请求中获取django当前用户的名字

时间:2016-05-24 06:26:38

标签: python django shell authentication

我必须更新"修改为"具有当前用户名称的模型中的字段。 通过这样的请求在视图中获取用户名非常容易:

  

request.user.username

但是,当使用shell修改模型的实例时(我有批量更新和处理条目的脚本),没有请求。

从请求(如果有)和shell进程获取当前用户名称的好方法是什么?

基于评论的更新:

自定义保存,假设有一个shell用户

是的,我正在使用自定义save()方法。 它看起来像:

  • 一个带有" general"的抽象模型类"修改的字段"并提供更新字段的方法;截至目前看来modified_by = "unknown user";
  • 一个真正的模型类将它作为mixin;
  • 许多视图和脚本都适用于该模型。

所以,我知道如何手动为字段分配值。 问题是如何知道某个特定事务是否在有或没有请求的情况下完成,如果没有请求(shell),则由哪个管理员/用户完成。

我尝试了什么:

  1. 将请求作为必需参数从任何视图传递到抽象模型,方法:它不起作用(至少,我不知道如何安全地编码所需参数和抽象模型的方法而不是视图中的普通功能);另外,我不知道如何从shell调用相同的方法时传递请求。

  2. 在shell中,我很容易得到User.objects.all()并尝试检查:如果用户已通过身份验证,则使用他/她的用户名,否则假设它是shell用户并手动分配&# 34; shell用户"值为"由"。

  3. 修改

    令我惊讶的是,任何返回的用户都在shell中进行了身份验证:

    >>> users = User.objects.all()
    >>> users
    [<User: teddy>, <User: alexander>]
    >>> users[0].is_authenticated()
    True
    >>> users[1].is_authenticated()
    True
    >>>
    

    所以,这个简单的场景对我来说没有...

    当自定义save()不够时

    进一步思考:

    1. 在管理员应用中触发的批量模型更新不使用save(),因此此处的任何自定义逻辑都不起作用...
    2. 使用Celery任务进行更新:尚未检查。
    3. 多个shell用户:必须使用普通的旧用户输入来询问名称并传递给脚本吗?
    4. 有什么想法可以提供帮助吗?

      这就是我解决它的方法:

      在保存模型时手动分配参数(who)的抽象类模型。

      class ModifiedAwareModel(models.Model):
      """
      ABC to keep track of when and by whom a model was created and updated.
      """
      created_on = models.DateTimeField(_('created on'), blank=True, editable=False)
      created_by = models.CharField(_('created by'), max_length=100, blank=True, editable=False)
      modified_on = models.DateTimeField(_('modified on'), blank=True, editable=False)
      modified_by = models.CharField(_('modified by'), max_length=100, blank=True, editable=False)
      
      class Meta:
          abstract = True
      
      def save(self, who="Django", *args, **kwargs):
      
          if not self.pk:
              self.created_on = timezone.now()
              self.created_by = who
              self.modified_on = timezone.now()
              self.modified_by = who
          else:
              self.modified_on = timezone.now()
              self.modified_by = who
          return super(ModifiedAwareModel, self).save(*args, **kwargs)
      

1 个答案:

答案 0 :(得分:0)

使用Django shell时,目前没有User。解决此问题的方法是让使用shell的人手动将User分配给modified by字段。这个User可能专门用于shell操作,但它不一定是这样的。另一种选择可能是为模型编写自定义save()函数,如果您只是通过shell更改它。