Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Admin使用save_model()加密更改(或保存)时某些字段的值_Python_Django_Encryption_Django Admin - Fatal编程技术网

Python Django Admin使用save_model()加密更改(或保存)时某些字段的值

Python Django Admin使用save_model()加密更改(或保存)时某些字段的值,python,django,encryption,django-admin,Python,Django,Encryption,Django Admin,我目前有一个自定义用户模型,其中一些字段应该加密(数据端),但在Django Admin上,它们需要解密以显示实际数据,因此我有encrypt\u string()和decrypt\u string()函数来处理它 我的用户模型: class User(AbstractUser): uid = models.CharField( "uid", max_length=255, null=True, blank=True) nickname = mod

我目前有一个自定义用户模型,其中一些字段应该加密(数据端),但在Django Admin上,它们需要解密以显示实际数据,因此我有
encrypt\u string()
decrypt\u string()
函数来处理它

我的用户模型:

class User(AbstractUser):
    uid = models.CharField(
      "uid", max_length=255, null=True, blank=True)
    nickname = models.CharField(
        "Nickname", max_length=255, null=True, blank=True)
    
    eth_address = models.CharField(
        "Eth address", max_length=255, null=True, blank=True)
    eth_private_key = models.CharField(
        "Eth private key", max_length=255, null=True, blank=True)
    evt_address = models.CharField(
        "Evt address", max_length=255, null=True, blank=True)
    evt_private_key = models.CharField(
        "Evt private key", max_length=255, null=True, blank=True)
在进行任何类型的保存或编辑时,需要加密eth_地址、eth_私钥、evt_地址和evt_私钥

当前,当我的服务器从api请求时,它将创建一个默认用户(django rest framework的自定义身份验证类上的句柄):

existed\u user\u check=user.objects.filter(uid=uid.exists())

在我的Django Admin中,我在Admin.py中编写了以下代码来处理解密(在更改视图中显示数据时)和加密(在保存或编辑这4个字段时):

自定义UserAdminForm,以便我解密数据,以便管理员在进行编辑或检查时可以查看数据。 解密后的数据能够正确显示在更改视图上

当管理员在Django admin change视图上编辑字段时,save_model()将处理数据加密

我当前的问题:

注意事项:

这些字段中的数据是存在的,所以我只讨论django admin上的编辑对象部分

当我试图编辑任何字段并保存它(应该加密)时,该字段被加密并保存,但它下面的字段(它的实际加密数据)现在更改为它的实际数据(未加密)

在更改视图上编辑evt_地址并保存后

使用
form=UserAdminForm

在UserAdminCustom上注释掉
#form=UserAdminForm
,以便显示实际数据

我打印了
getattr(self.instance,field)
以查看加载django admin change视图时的加密数据,并得到以下4个加密字段:

web_1         | eth_address : gAAAAABeAcoI08bH2fQqJboZFxg6xn5RCxdRopllS6fDeyRmsC3qzsTXo88NVYOb58eeX5IXQpxqcGhbLr8wRRoWSKQsX5vLbPPhmWqUiqf0XYQvdWUhhgYxxMwwqgEOwU2OtJfkZ0p6
web_1         | eth_private_key : gAAAAABeAcoIp1V9sKNnL-dO-fWH1W1oM7hbqky44aRLchmTtvckaaZdaKuXo1xIIozx3xl40Y2Ct3YAyCOfkJJranKgTNDcVhndYdu5-awOuYpPCJKkSSia7IP_gWjLE91Gh8vsGnkn1iEkrLaho2ff0vVHS1QgGaJxji5m7cwCk0tqSp2AIeA=
web_1         | evt_address : gAAAAABeAcoIM3rywSgAPL611WUoWLJ9mqIgUHhZn8KDQd9hi9xHzgRri0EkoS_yBvwQyzdH72RWJRsDCs38oF9P8HHW_wFDWQ==
web_1         | evt_private_key : 1814067
因此,在编辑
evt_地址
值并保存后,我的
evt_私钥
数据被更改为
1814067

为什么会发生这种情况,我很困惑是什么原因造成的


希望有人能帮我

你在错误的抽象层上做这件事

请按照本指南创建自定义Django字段,以便为您处理加密/解密:


或者只是使用一些现有的解决方案,比如:

在多次尝试修改
保存(u model
函数后,我意识到表单的数据实际上来自
用户管理表单
,因此为了能够修改django管理表单上的数据,我需要在保存之前从表单本身对其进行加密

class UserAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserAdminForm, self).__init__(*args, **kwargs)
        for field in user_profile_encrypt_fields:
            if getattr(self.instance, field) is not None:
                try:
                    self.initial[field] = decrypt_string(getattr(self.instance, field))
                except:
                    pass

    def clean_eth_address(self):
        if self.cleaned_data['eth_address'] is not None:
            data = encrypt_string(self.cleaned_data['eth_address'])
        else:
            data = None

        return data

    def clean_eth_private_key(self):
        if self.cleaned_data['eth_private_key'] is not None:
            data = encrypt_string(self.cleaned_data['eth_private_key'])
        else:
            data = None

        return data

    def clean_evt_address(self):
        if self.cleaned_data['evt_address'] is not None:
            data = encrypt_string(self.cleaned_data['evt_address'])
        else:
            data = None

        return data

    def clean_evt_private_key(self):
        if self.cleaned_data['evt_private_key'] is not None:
            data = encrypt_string(self.cleaned_data['evt_private_key'])
        else:
            data = None

        return data

现在,每当我在管理表单上进行更改时,它都会使用自定义模型字段进行加密,这是一个好主意,但这不是我想要的,因为将来我可能也会使用解密值。如果一个字段在django admin上被保存或更改,我还想更改它的值,这是一个我将在future@LinhNguyen这就是我的想法。自定义字段将与django admin一起工作,无需任何更改。我将在下一个项目中实现这一点,我只想为django admin不断变化的值提供一个解决方案(可能不是加密/解密方式,而是在保存时格式化某些字段)因为我计划在未来使用它,我在这方面取得了成功:django加密字段自2016年以来从未更新过。此外,它还使用了keychar,这是去润滑。
web_1         | eth_address : gAAAAABeAcoI08bH2fQqJboZFxg6xn5RCxdRopllS6fDeyRmsC3qzsTXo88NVYOb58eeX5IXQpxqcGhbLr8wRRoWSKQsX5vLbPPhmWqUiqf0XYQvdWUhhgYxxMwwqgEOwU2OtJfkZ0p6
web_1         | eth_private_key : gAAAAABeAcoIp1V9sKNnL-dO-fWH1W1oM7hbqky44aRLchmTtvckaaZdaKuXo1xIIozx3xl40Y2Ct3YAyCOfkJJranKgTNDcVhndYdu5-awOuYpPCJKkSSia7IP_gWjLE91Gh8vsGnkn1iEkrLaho2ff0vVHS1QgGaJxji5m7cwCk0tqSp2AIeA=
web_1         | evt_address : gAAAAABeAcoIM3rywSgAPL611WUoWLJ9mqIgUHhZn8KDQd9hi9xHzgRri0EkoS_yBvwQyzdH72RWJRsDCs38oF9P8HHW_wFDWQ==
web_1         | evt_private_key : 1814067
class UserAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserAdminForm, self).__init__(*args, **kwargs)
        for field in user_profile_encrypt_fields:
            if getattr(self.instance, field) is not None:
                try:
                    self.initial[field] = decrypt_string(getattr(self.instance, field))
                except:
                    pass

    def clean_eth_address(self):
        if self.cleaned_data['eth_address'] is not None:
            data = encrypt_string(self.cleaned_data['eth_address'])
        else:
            data = None

        return data

    def clean_eth_private_key(self):
        if self.cleaned_data['eth_private_key'] is not None:
            data = encrypt_string(self.cleaned_data['eth_private_key'])
        else:
            data = None

        return data

    def clean_evt_address(self):
        if self.cleaned_data['evt_address'] is not None:
            data = encrypt_string(self.cleaned_data['evt_address'])
        else:
            data = None

        return data

    def clean_evt_private_key(self):
        if self.cleaned_data['evt_private_key'] is not None:
            data = encrypt_string(self.cleaned_data['evt_private_key'])
        else:
            data = None

        return data