【问题标题】:Can we get the request object data in signal我们可以在信号中获取请求对象数据吗
【发布时间】:2016-04-11 20:49:09
【问题描述】:

我正在用户模型中注册数据,并且还希望将配置文件数据同时保存在配置文件模型中,例如 first_name 和 last_name。

所以我使用 django 信号来存储配置文件信息并将邮件发送给用户。

但我们无法获取信号文件中的名字和姓氏:

        #---------------------------- Create profile at the time of registration --------------------------#
    def register_profile(sender, **kwargs):  
        if kwargs.get('created'):
            user = kwargs.get('instance')
            request = kwargs.get("request")
            if user.id is not None and user._disable_signals is not True:
                    profile = Profile(user=user)
                    if user.status is not 1:
                        #------------------- Send the registration mail to user and it have confirmation link ----------#
                        salt = hashlib.sha1(str(random.random())).hexdigest()[:5]            
                        activation_key = hashlib.sha1(salt+user.email).hexdigest()            
                        key_expires = datetime.datetime.today() + datetime.timedelta(2)                    
                        #print user
                        profile.activation_key = activation_key
                        profile.key_expires = key_expires
                    #--------------------- End -------------------------------------------------------------#

                    profile.save()
                    if user.status is not 1:
                        user = model_to_dict(user)
                        BaseSendMail.delay(user,type='account_confirmation',key = activation_key)
                    return
    post_save.connect(register_profile, sender=User, dispatch_uid='register_profile')
    #-------------------------- End ---------------------------------------------------------------------#

在上面的代码中,我无法获取注册时发送的名字和姓氏数据。另外我想提一下,名字和姓氏字段属于配置文件模型。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    不,你不应该尝试。信号可以从任何地方执行:管理脚本、Celery 任务、各种可能没有请求的地方。

    您可以像使用_disable_signals 属性一样将数据临时存储在用户实例上。但是我怀疑这并不是最好的信号。由于您要保存表单提交的结果,并且它取决于该表单中的数据,因此您应该在视图或表单本身中执行此操作。

    【讨论】:

      【解决方案2】:

      我这样做了,它奏效了。 不确定它对性能等的影响。

      some_file.py:

      data = {}
      

      中间件.py:

      class MyMiddleware(object):
      
          def process_request(self):
      
              from path.to.some_file import data
              data['request'] = self.request
      

      信号/模型方法/管理器/模板标签/其他任何地方:

      from path.to.some_file import data
      request = data.get('request')
      

      【讨论】:

      • 你不应该在 django 中使用全局变量,这样导入也不会达到你想要的效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2012-07-10
      相关资源
      最近更新 更多