From 53e91fa458ee3dd46345d895b9af23c47a0f5aed Mon Sep 17 00:00:00 2001 From: ngfchl Date: Tue, 7 Apr 2026 12:51:57 +0800 Subject: [PATCH] =?UTF-8?q?update.=20=E6=B7=BB=E5=8A=A0jwt=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=92=8C=E6=8E=A5=E5=8F=A3=E6=9D=83=E9=99=90=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/settings.py | 97 ++++++++++++++++++++-------------------------- server/urls.py | 4 +- 2 files changed, 44 insertions(+), 57 deletions(-) diff --git a/server/settings.py b/server/settings.py index 25d5497..9ca12e8 100644 --- a/server/settings.py +++ b/server/settings.py @@ -10,6 +10,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/6.0/ref/settings/ """ import os +from datetime import timedelta from pathlib import Path import environ @@ -221,63 +222,47 @@ MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 日志配置 -LOGGING = { - 'version': 1, # 版本 - 'disable_existing_loggers': False, # 是否禁用已经存在的日志器 - 'formatters': { # 日志信息显示的格式 - 'verbose': { - 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' - }, - 'simple': { - 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' - }, - }, - 'filters': { # 过滤器 - 'require_debug_true': { # django在debug模式下才输出日志 - '()': 'django.utils.log.RequireDebugTrue', - }, - }, - 'handlers': { # 日志处理方法 - 'console': { # 向终端中输出日志 - 'level': 'DEBUG', # 输出等级为“INFO” - 'filters': ['require_debug_true'], - 'class': 'logging.StreamHandler', - 'formatter': 'simple' - }, - 'file': { # 向文件中输出日志 - 'level': os.getenv('LOGGER_LEVEL') if os.getenv('LOGGER_LEVEL') else 'INFO', # 输出等级为“INFO” - # 新增内容 - # 'class': 'logging.handlers.TimedRotatingFileHandler', - # 'filename': os.path.join(BASE_DIR, 'logs/logs.log'), - # 'when': 'm', - # 'interval': 10, - # 'backupCount': 10, - 'class': 'logging.handlers.RotatingFileHandler', - 'filename': BASE_DIR / "db/logs/django_server.log", # 日志文件的位置 - 'maxBytes': 5 * 1024 * 1024, # 日志文件的大小(300*1024*1024为300MB) - 'backupCount': 10, # 日志文件的数量(超过设定的最大值会自动备份,备份数量最大值为10) - 'formatter': 'verbose', # 日志输出格式:使用了在之前定义的'verbose' - 'encoding': 'utf-8' # 新增此行,指定文件编码为UTF-8 - }, - }, - 'loggers': { # 日志器 - 'ptools': { # 定义了一个名为django的日志器 - 'handlers': ['console', 'file'], # 可以同时向终端与文件中输出日志 - 'propagate': True, # 是否继续传递日志信息 - 'level': os.getenv('LOGGER_LEVEL') if os.getenv('LOGGER_LEVEL') else 'INFO', # 日志器接收的最低日志级别 - }, - 'requests': { - 'level': 'WARNING', - 'handlers': ['console'], # 或你定义的其他 handler - 'propagate': False, - }, - 'urllib3': { - 'level': 'WARNING', - 'handlers': ['console'], - 'propagate': False, - }, - } +NINJA_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=15), # 访问令牌有效期 + 'REFRESH_TOKEN_LIFETIME': timedelta(days=3), # 刷新令牌有效期 + 'ROTATE_REFRESH_TOKENS': False, + 'BLACKLIST_AFTER_ROTATION': False, # 旋转后列入黑名单 + 'UPDATE_LAST_LOGIN': True, # 更新最后登录 + + 'ALGORITHM': 'HS256', + 'SIGNING_KEY': SECRET_KEY, + 'VERIFYING_KEY': None, + 'AUDIENCE': None, + 'ISSUER': None, + 'JWK_URL': None, + 'LEEWAY': 0, + + 'USER_ID_FIELD': 'id', + 'USER_ID_CLAIM': 'user_id', + 'USER_AUTHENTICATION_RULE': 'ninja_jwt.authentication.default_user_authentication_rule', + + # 'AUTH_TOKEN_CLASSES': ('ninja_jwt.tokens.AccessToken',), + # 'TOKEN_TYPE_CLAIM': 'token_type', + # 'TOKEN_USER_CLASS': 'ninja_jwt.models.TokenUser', + + # 'JTI_CLAIM': 'jti', + # + # 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', + # 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), + # 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), + + # For Controller Schemas + # FOR OBTAIN PAIR + # 'TOKEN_OBTAIN_PAIR_INPUT_SCHEMA': "ninja_jwt.schema.TokenObtainPairInputSchema", + # 'TOKEN_OBTAIN_PAIR_REFRESH_INPUT_SCHEMA': "ninja_jwt.schema.TokenRefreshInputSchema", + # FOR SLIDING TOKEN + # 'TOKEN_OBTAIN_SLIDING_INPUT_SCHEMA': "ninja_jwt.schema.TokenObtainSlidingInputSchema", + # 'TOKEN_OBTAIN_SLIDING_REFRESH_INPUT_SCHEMA': "ninja_jwt.schema.TokenRefreshSlidingInputSchema", + # + # 'TOKEN_BLACKLIST_INPUT_SCHEMA': "ninja_jwt.schema.TokenBlacklistInputSchema", + # 'TOKEN_VERIFY_INPUT_SCHEMA': "ninja_jwt.schema.TokenVerifyInputSchema", } + # 调整POST传输数据文件大小限制 DATA_UPLOAD_MAX_MEMORY_SIZE = 25 * 1024 * 1024 * 1024 FILE_UPLOAD_MAX_MEMORY_SIZE = 25 * 1024 * 1024 * 1024 diff --git a/server/urls.py b/server/urls.py index e2fb74a..cb74342 100644 --- a/server/urls.py +++ b/server/urls.py @@ -28,6 +28,7 @@ from loguru import logger from ninja.errors import ValidationError from ninja_extra import NinjaExtraAPI from ninja_jwt.controller import NinjaJWTDefaultController +from ninja_jwt.authentication import JWTAuth from base.views import custom_upload_file from common.common_response import CommonResponse @@ -92,10 +93,11 @@ class UnifiedNinjaAPI(NinjaExtraAPI): return super().create_response(request, data, status=status, temporal_response=temporal_response) -api_v1 = UnifiedNinjaAPI(version='1.0.0') +api_v1 = UnifiedNinjaAPI(version='1.0.0', auth=JWTAuth()) api_v1.register_controllers(NinjaJWTDefaultController) auto_load_routers() +logger.debug(api_v1.urls) @api_v1.exception_handler(ValidationError)