django-rest-framework - 如何标记/加密 django 中的字段?
问题描述
在下面的屏幕截图中,实际密码看起来像Password123
但是当我运行时
user = User.objects.create(...)
user.set_password('Password123')
user.save()
#then in login I have to run
from django.contrib.auth import authenticate
user = authenticate(username=username, password=password)
user....
但是,Django 会自动设置它像这样处理加密或标记化,无论您如何命名,以及解析authenticate
函数。
- 问题:我想对一个整数字段做同样的事情,以防止管理员看到该字段,因此它将是一个只有用户才能看到的秘密。
解决方案
您可以user.set_password()
在内部检查参数值的作用,并对有问题的数字执行相同的操作。您可以使用模型的save()
方法,或者最好使用表单的clean_<field>()
方法
# the form where user submits data
class UserForm(forms.ModelForm): # works even with forms.Form
def clean_secret_number(self):
"""assuming the field name is called `secret_number`"""
value = self.cleaned_data.get('secret_number')
if not value:
# no value got submitted, return early
return value
# do the same thing which happens in `user.set_password()`
value = make_password(value)
# return the hashed value from form
return value
请注意,在显示包含现有数据的表单时,将表单的字段保持为空很重要,否则在提交表单时它会再次散列已经散列的值。
推荐阅读
- php - 出于某种原因,当我将其添加到我的代码中时,我得到了意外的文件结束错误。但我无法弄清楚这段代码有什么问题
- javascript - 如何使用 Firebase Auth 作为 OIDC 向 Amplify GraphQL 发出经过身份验证的请求?
- c - 具有共享队列 C 的生产者消费者
- python - 如果网站崩溃,有没有办法让机器人自动重启
- python - 如何在 Python 中使用 Mayavi 在 tvtk 渲染场景上旋转演员?
- python - 是否有显示进度条的progress_transform,如progress_apply?
- ssl - 尝试通过移动数据访问网站时出现 ERR_SSL_PROTOCOL_ERROR
- python - 参数 1 必须是字符串,而不是元组
- opencv - opencv 可以在 cv::Mat 中绘制浮点坐标矩形吗?
- compiler-construction - 什么是语言前端?