我们可以在信号中获取请求对象数据吗?

时间:2016-01-07 12:48:41

标签: python django django-rest-framework

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

所以我使用django信号来存储个人资料信息并将邮件发送给用户。

但我们无法获取信号文件中的first_name和last_name:

        #---------------------------- 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 ---------------------------------------------------------------------#

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

我做到了这一点并且有效。 不确定它对性能等的影响。

some_file.py:

data = {}

middleware.py:

class MyMiddleware(object):

    def process_request(self):

        from path.to.some_file import data
        data['request'] = self.request

signals / model_method / manager / template tag / any where:

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