django - 如何在保存到数据库之前加密 TextField

标签 django python-2.7 django-models django-admin

我在这里尝试创建可以保存密码的模型,这里是我的模型:

class Server(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=20, null=True)
    hostname = models.CharField(max_length=50, null=True, blank=True)
    ip = models.GenericIPAddressField()
    ip2 = models.GenericIPAddressField(null=True, blank=True)
    user_name = models.CharField(max_length=20, null=True)
    password = models.TextField(max_length=500, null=True, blank=True)
    ssh_key = models.FileField(null=True, blank=True, upload_to='Keys/')

直到现在我读了很多博客和帖子,但我还没有找到任何好的方法来将加密文本保存到数据库中

我正在尝试这种方法,但它对我也不起作用,请检查下面的 View.py,

from cryptography.fernet import Fernet
class HostCreate(CreateView):
    model = Server
    template_name = 'inventory/host_create.html'
    form_class = HostForm

    # after getting POST data of fields (name, hostname, ip, pass, key) adding user and saving
    def form_valid(self, form):
        host = form.save(commit=False)
        host.user = User.objects.get(pk=self.request.user.pk)
        host.password = self.ecrypt(host.password)
        host.save()
        return redirect('inventory:hosts')

    def ecrypt(self, password): # need password and return cipher password
        key = 'wgjSSyfVKgz0EjyTilqeJSaANLDu7TzHKdpAXUeZPbM='
        cipher_suite = Fernet(key)
        cipher_text = cipher_suite.encrypt(password)
        return cipher_text 

这里出现错误,

Exception Type:     TypeError
Exception Value:    data must be bytes.
Exception Location:     /usr/lib64/python2.7/site-packages/cryptography/fernet.py in _encrypt_from_parts, line 55

密码字段是否有内置的 django 功能?

最佳答案

您可以通过两种可能的方式做到这一点。

  1. 像这样为您的模型编写自定义保存方法

    class Server(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=20, null=True)
        hostname = models.CharField(max_length=50, null=True, blank=True)
        ip = models.GenericIPAddressField()
        ip2 = models.GenericIPAddressField(null=True, blank=True)
        user_name = models.CharField(max_length=20, null=True)
        password = models.TextField(max_length=500, null=True, blank=True)
        ssh_key = models.FileField(null=True, blank=True, upload_to='Keys/')
    
        def save(self, *args, **kwargs):
            if not self.pk:
                # encrypt_field_value_here
            super(Server, self).save(*args, **kwargs)
    
  2. 您可以使用自定义模型字段。您可以从 here 获得相关文档.还要检查 here 中的 BaseEncryptedField .

您还可以使用 this包。

关于django - 如何在保存到数据库之前加密 TextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37741339/

相关文章:

javascript - Django - 将模型序列化为 json 以用作 JavaScript 对象

python-2.7 - Pandas to_csv 编码较慢?

Django - 管理中的外键字段初始值定义

Django 和保持坐标

python - 在 tastypie 的 url 中切换字段以使其完整?

django - 如何使用 factory_boy 设置用户组

python - 附加具有不同列名称的数据框 - Pandas

django - 为现有数据库/sql View 创建 django 模型?

django - 在 Django REST 框架中结合 request.data 和 request.query_params

Python下载文件,无需外部库