Skip to content

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;
  • 新建临时用于迁移同步的 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

Released under the CC-BY-NC-4.0