Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
在知道了 Django 项目下的 Settings.py 文件需要有哪些配置后,那就再了解下 Django 密码系统。Django 有很多中密码加密的方式,但是在新建项目时,会默认配置密码加密以及校验的方式。
#算法+迭代+盐+加密<algorithm>$<iterations>$<salt>$<hash>
settings 默认配置
PASSWORD_HASHERS[0]为正在使用的加密存储方式,其他为检验密码时,可以使用的方式。
PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.Argon2PasswordHasher',]
其它加密方式配置,所有支持的hasher。
[ 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', 'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher', 'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher', 'django.contrib.auth.hashers.CryptPasswordHasher',]
② 手动校验密码
在进行用户登陆验证的时候,如果是亲自写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;
如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要编写大量的代码。事实上,Django已经提供了内置的用户认证功能。
在使用"python manage.py makemigrations"和"python manage.py migrate"迁移完成数据库之后,根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是
from django.contrib.auth.hashers import make_password
# 手动生成加密的密码,如果password=None,则生成的密码永远无法被check_password()make_password(password, salt=None, hasher="default")
from django.contrib.auth.hashers import check_password
# 和数据库的密码进行校验check_password(password, encoded)
from django.contrib.auth.hashers import is_password_usable
#检查密码是否可被check_password()is_password_usable(encoded_password)
AUTH_PASSWORD_VALIDATORS = [
# 检验和用户信息的相似度 { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },# 校验密码最小长度 { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': { 'min_length': 9, } },
# 校验是否为过于简单(容易猜)密码 { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
# 校验是否为纯数字 { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', },]