后端API配置简化

Django

众所周知,Django是一个全栈框架,基于MVT设计模式,但目前主流开发为前后分离模式,无需使用Django提供的template功能,因此仅需集成API模块即可。

创建项目

安装好环境后,使用

django-admin startproject project_name

完成项目的创建,项目目录结构如下图:

simplified_django_dir.png

精简

点击进入setting.py文件中,主要关注INSTALLED_APPSMIDDLEWARE

app_setting.png

针对INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin', # 可移除
    'django.contrib.auth', # 用于用户认证
    'django.contrib.contenttypes', # 所有模型的注册中心或者目录,ORM核心依赖
    'django.contrib.sessions', # 使用JWT等Token认证技术可移除
    'django.contrib.messages', # 可移除
    'django.contrib.staticfiles', # 可移除
]
应用名称 (Application)主要功能是否可移除移除条件与说明
django.contrib.admin提供功能强大的后台管理界面可移除不需要使用 Django 自带的后台管理功能,可以安全地移除 。
django.contrib.auth实现用户认证和授权系统不可移除Django 权限系统的核心,提供用户身份信息,许多第三方应用的依赖 。
django.contrib.contenttypes内容类型框架,用于追踪项目中的所有模型,为模型提供高级通用接口不可移除ORM 的核心依赖,许多 Django 内部机制(如权限系统)和第三方应用依赖于此框架 。
django.contrib.sessions支持会话管理可移除若 API 完全采用 Token 认证(如 JWT),无需服务端 Session,可移除 。
django.contrib.messages实现一次性通知功能可移除纯 API 项目一般无需使用消息框架,可以移除
django.contrib.staticfiles管理静态文件(如 CSS、JavaScript、图片)可移除前后端分离时,前端资源通常由独立服务(如 Nginx)或 CDN 托管,可以移除 。

此外对于纯后端项目还需要额外安装以下第三方应用:

  1. rest_framework:提供restfulAPI支持。
  2. corsheaders:实现跨域请求。

此外,由于移除了admin应用,因此对于初始的Django项目中的urls.py中需要同步删除admin相关内容,如下:

删除之前:

from django.contrib import admin
from django.urls import path

urlpatterns = [
   path('admin/', admin.site.urls),
]

删除之后(即可编写自己的请求路径):

urlpatterns = [
   
]

针对MIDDLEWARE

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', # 安全防护中间件
    'django.contrib.sessions.middleware.SessionMiddleware', # 与Session应用同步移除
    'django.middleware.common.CommonMiddleware', # URL 规范化中间件
    'django.middleware.csrf.CsrfViewMiddleware', # 表单提交认证,可移除
    'django.contrib.auth.middleware.AuthenticationMiddleware', # 权限认证基石
    'django.contrib.messages.middleware.MessageMiddleware', # 与message应用同步移除
    'django.middleware.clickjacking.XFrameOptionsMiddleware', # 可移除
]
中间件名称 (Middleware)主要功能可否移除移除建议与说明
SecurityMiddleware安全防护(设置安全HTTP头、HTTPS重定向、防XSS等)必须保留。核心安全屏障,生产环境尤为重要。
SessionMiddleware会话管理(基于Cookie或URL保持用户状态)可选若API完全采用Token认证(如JWT),无需服务端Session,可移除。移除后需同步移除 sessionsApp。
CommonMiddleware提供基础功能(URL规范化、APPEND_SLASH自动补全斜杠、禁用不存在URL的访问)建议保留可移除,但其提供的URL规范化等基础功能通常有益,建议保留
CsrfViewMiddlewareCSRF防护(验证POST请求中的CSRF令牌)可选前后端分离项目通常使用Token认证,可移除。若保留,需为API视图添加 @csrf_exempt装饰器。
AuthenticationMiddleware用户认证(为每个请求附加 request.user对象)必须保留。它是Django权限系统的基石,提供用户身份信息。
MessageMiddleware消息框架(在请求间传递一次性提示消息)可选纯API项目一般无需使用消息框架,可移除。移除后需同步移除 messagesApp。
XFrameOptionsMiddleware点击劫持防护(通过设置X-Frame-Options响应头限制页面被嵌入)可选纯API服务返回的是数据而非HTML页面,通常可移除

此外对于纯后端项目还需要额外安装以下第三方中间件:

  • 'corsheaders.middleware.CorsMiddleware':实现跨域请求。

移除后以及添加restfulAPI支持与跨域支持后的列表:

simplified_res.png

补充:进一步精简Django配置(针对纯API项目)

1. 移除模板配置

# 删除整个TEMPLATES配置块
# 完全删除以下配置块
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2. 移除静态文件配置

# 删除STATIC_URL配置
STATIC_URL = 'static/'  # 完全删除此行

3. 移除密码验证器

# 删除整个AUTH_PASSWORD_VALIDATORS配置块
# 删除整个密码验证器配置块
AUTH_PASSWORD_VALIDATORS = [

{
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

4. 简化国际化配置(分离情况下在前端进行国际化)

# 禁用国际化
USE_I18N = False  # 改为 False
USE_TZ = False    # 改为 False(除非需要时区支持)

# 可选:删除语言和时区配置(使用默认值即可)
LANGUAGE_CODE = 'en-us'  # 可删除
TIME_ZONE = 'UTC'        # 可删除

5. 精简后的完整配置示例

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'django-insecure-!sn7rpw08=y11tialx9zrh3ap6%8oq=a$ki%^y@21e%p%5bn#u'
DEBUG = True
ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'rest_framework',
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
]

ROOT_URLCONF = 'simplified_django.urls'
WSGI_APPLICATION = 'simplified_django.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

CORS_ALLOW_ALL_ORIGINS = True

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}

额外建议

  1. 安全强化
DEBUG = False
SECRET_KEY = '生成强密码替换此处'
ALLOWED_HOSTS = ['your-api-domain.com']
  1. 自定义用户模型
AUTH_USER_MODEL = 'users.CustomUser'
  1. 数据库优化(使用其他数据库):
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}