Django
常见配置
修改日志
禁用 request access logging
python
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'null': {
'class': 'logging.NullHandler',
},
},
'loggers': {
'django.server': {
'handlers': ['null'],
'level': 'INFO',
'propagate': False,
},
},
}特定场景应用
兼容多框架 model
使用 Django Admin 构建 简陋后台,同时使用其他语言和框架(如 Go )构建数据接口服务,并且复用 django authentication 和关联的 auth_user 数据表记录是可能的。
在创建用户
- 参考 Django-style pbkdf2_sha256 hash 从原密码,生成哈希后密码
- 在
auth_user表写入记录
验证用户帐号密码
- 参考 Django 验证中间件流程,实现 pbkdf2_sha256 hash 密码校验流程
- 按特定模式生成 cookie 或 JWT 代替后续账号密码传输验证
备份和恢复数据
Case 迁移 django-all-auth app MySQL 数据到 PostgreSQL
django-all-auth django 统一认证 app
迁移工具 pgloader
要点:
- pgloader 2024-08 v3.6.9 只支持 MySQL mysql_native_password 认证,因此 mysql-sever 必须 8.0 不能是 8.4,8.4 中彻底废弃了 mysql_native_password 相关支持和配置选项;
- mysql server & client 设置默认认证方式为 mysql_native_password;
- macOS 上必须使用
brew install mysql-client@8.0, 以启用 mysql_native_password
- macOS 上必须使用
- 新建临时用于迁移同步的 mysql 用户并设置 native password
create user if not exists 'repl'@'%' identified with mysql_native_password by 'secret';grant all privileges on my-db.* to 'repl'@'%' with grant option;flush privileges;
- 修改 socialaccount_socialapp 表 settings 字段 JSON 默认值:
ALTER TABLE socialaccount_socialapp MODIFY settings json not null; - 执行迁移
pgloader mysql://user:password@host:port/db_name postgresql://user:password@host:port/db_name
注意:2024-09 django-allauth==0.63.6 使用默认 django.db.backends.postgresql ,在用户 sign in with apple 会抛出 JSON 反序列化错误:
File "/usr/local/lib/python3.12/site-packages/allauth/socialaccount/helpers.py", line 67, in complete_social_login
return flows.login.complete_login(request, sociallogin)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/allauth/socialaccount/internal/flows/login.py", line 46, in complete_login
pre_social_login(request, sociallogin)
File "/usr/local/lib/python3.12/site-packages/allauth/socialaccount/internal/flows/login.py", line 37, in pre_social_login
sociallogin.lookup()
File "/usr/local/lib/python3.12/site-packages/allauth/socialaccount/models.py", line 315, in lookup
if not self._lookup_by_socialaccount():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/allauth/socialaccount/models.py", line 321, in _lookup_by_socialaccount
a = SocialAccount.objects.get(
^^^^^^^^^^^^^^^^^^^^^^^^^^
...
File "/usr/local/lib/python3.12/site-packages/django/db/models/fields/json.py", line 94, in from_db_value
return json.loads(value, cls=self.decoder)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/json/__init__.py", line 339, in loads
raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not dict