Django项目

一、核心差异与原则

  1. 职责划分
    • 后端(Django):仅负责数据处理、业务逻辑、权限校验,输出JSON格式的API。
    • 前端:负责页面渲染、用户交互,通过AJAX/Fetch/axios等调用后端API。
  2. 关键技术
    • 后端:Django + Django REST framework(DRF,简化API开发)。
    • 跨域处理:需配置CORS(跨域资源共享)。
    • 认证:常用JWT(JSON Web Token)替代传统Session认证。

二、项目开发流程

1. 环境准备
  • 安装核心依赖:

    bash 复制代码
    pip install django djangorestframework django-cors-headers djangorestframework-simplejwt  # 核心库:DRF、CORS、JWT
2. 创建项目与应用
  • 项目结构与传统类似,但需新增API专用应用(如api):

    bash 复制代码
    django-admin startproject backend  # 项目名(后端专用)
    cd backend
    python manage.py startapp api  # 存放API视图、序列化器等
    python manage.py startapp users  # 可选:用户认证专用应用
3. 核心配置(settings.py

重点配置DRF、CORS、JWT认证:

python 复制代码
# 注册应用
INSTALLED_APPS = [
    # Django内置
    'django.contrib.admin',
    'django.contrib.auth',
    ...
    # 第三方应用
    'rest_framework',          # DRF框架
    'corsheaders',             # CORS跨域
    'rest_framework_simplejwt',# JWT认证
    # 自定义应用
    'api',
    'users',
]

# 中间件:CORS中间件需放在最前面(尤其是CommonMiddleware之前)
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 跨域中间件
    'django.middleware.common.CommonMiddleware',
    ...
]

# CORS配置(允许前端域名访问)
CORS_ALLOWED_ORIGINS = [
    "http://localhost:8080",  # 前端本地开发地址(Vue默认8080,React默认3000)
    "http://127.0.0.1:8080",
]
CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie(如需)

# DRF配置
REST_FRAMEWORK = {
    # 认证方式:JWT
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    # 权限控制:默认需认证
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    # 分页(可选)
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

# JWT配置(过期时间等)
from datetime import timedelta
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),  # 访问令牌有效期
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),     # 刷新令牌有效期
    'ROTATE_REFRESH_TOKENS': False,
}

# 数据库配置(同传统项目,推荐PostgreSQL/MySQL)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'backend_db',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

三、项目结构(前后端分离专用)

复制代码
backend/                      # 后端项目根目录
├── manage.py
├── backend/                  # 项目配置目录
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py           # 核心配置(DRF、CORS、JWT等)
│   ├── urls.py               # 主路由(聚合API路由)
│   └── wsgi.py
├── api/                      # API应用(核心业务接口)
│   ├── __init__.py
│   ├── admin.py              # 可选:后台管理
│   ├── apps.py
│   ├── migrations/
│   ├── models.py             # 数据模型(ORM)
│   ├── serializers.py        # DRF序列化器(数据格式转换)
│   ├── urls.py               # API路由(如/api/articles/)
│   ├── views.py              # API视图(处理请求,返回JSON)
│   └── tests.py              # 接口测试
├── users/                    # 用户认证应用(可选)
│   ├── __init__.py
│   ├── serializers.py        # 用户序列化器(登录/注册)
│   ├── urls.py               # 认证路由(如/login/、/register/)
│   └── views.py              # 登录/注册视图
└── requirements.txt          # 依赖清单(pip freeze > requirements.txt)

四、代码编写要点

1. 数据模型(models.py

与传统项目一致,定义数据库表结构:

python 复制代码
# api/models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title
2. 序列化器(serializers.py

DRF核心组件,负责模型数据与JSON的转换(序列化/反序列化):

python 复制代码
# api/serializers.py
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'content', 'created_at']  # 需返回的字段
        read_only_fields = ['id', 'created_at']  # 只读字段(前端无需提交)
3. API视图(views.py

使用DRF的视图类(如ModelViewSet)快速实现CRUD接口:

python 复制代码
# api/views.py
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    """提供文章的增删改查接口"""
    queryset = Article.objects.all()  # 查询集
    serializer_class = ArticleSerializer  # 关联序列化器
4. URL路由配置
  • 应用级路由(api/urls.py):

    python 复制代码
    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    from .views import ArticleViewSet
    
    # 自动生成路由(list/create/update/delete)
    router = DefaultRouter()
    router.register(r'articles', ArticleViewSet)  # 路由前缀:/api/articles/
    
    urlpatterns = [
        path('', include(router.urls)),
    ]
  • 项目级路由(backend/urls.py):

    python 复制代码
    from django.contrib import admin
    from django.urls import path, include
    from rest_framework_simplejwt.views import (
        TokenObtainPairView,  # 获取令牌(登录)
        TokenRefreshView,     # 刷新令牌
    )
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('api/', include('api.urls')),  # API接口根路径
        # JWT认证路由
        path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
        path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    ]
5. 用户认证(登录/注册)

示例:自定义注册视图(users/views.py):

python 复制代码
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from django.contrib.auth.models import User
from .serializers import UserSerializer

class RegisterView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()  # 创建用户
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

对应序列化器(users/serializers.py):

python 复制代码
from rest_framework import serializers
from django.contrib.auth.models import User
from django.contrib.auth.password_validation import validate_password

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def create(self, validated_data):
        user = User.objects.create_user(
            username=validated_data['username'],
            email=validated_data.get('email', ''),
            password=validated_data['password']
        )
        return user

五、测试API

  1. 启动开发服务器:python manage.py runserver
  2. 访问接口(推荐使用Postman或浏览器插件测试):
    • 注册:POST http://127.0.0.1:8000/api/register/(参数:usernameemailpassword
    • 登录(获取令牌):POST http://127.0.0.1:8000/api/token/(参数:usernamepassword,返回accessrefresh令牌)
    • 获取文章列表:GET http://127.0.0.1:8000/api/articles/(请求头需携带Authorization: Bearer <access_token>

六、注意事项

  1. 跨域安全

    • 生产环境中CORS_ALLOWED_ORIGINS需严格限制为前端域名,避免*(允许所有域名)。
    • 如需携带cookie,需配置CORS_ALLOW_CREDENTIALS = True,且前端请求需设置withCredentials: true
  2. JWT安全

    • 合理设置令牌过期时间(ACCESS_TOKEN_LIFETIME不宜过长)。
    • 生产环境中通过HTTPS传输令牌,避免明文泄露。
    • 敏感操作(如修改密码)可要求重新验证令牌。
  3. API权限控制

    • 使用DRF的permission_classes控制接口权限(如IsAuthenticatedIsAdminUser)。

    • 自定义权限类(如仅作者可修改自己的文章):

      python 复制代码
      from rest_framework import permissions
      
      class IsAuthor(permissions.BasePermission):
          def has_object_permission(self, request, view, obj):
              return obj.author == request.user  # 假设模型有author字段关联User
  4. 数据验证

    • 序列化器中通过validatorsdef validate_<field>()方法严格验证前端传入数据。
    • 避免直接使用request.data操作数据库,必须通过序列化器校验。
  5. 生产环境配置

    • 关闭DEBUG = False,配置ALLOWED_HOSTS

    • 使用环境变量存储敏感信息(SECRET_KEY、数据库密码等):

      python 复制代码
      import os
      SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
    • 部署时使用Gunicorn/uWSGI作为WSGI服务器,搭配Nginx处理静态文件和反向代理。

  6. 文档自动生成

    • 集成DRF Swagger(drf-yasg)或ReDoc自动生成API文档,方便前后端协作:

      bash 复制代码
      pip install drf-yasg

      配置后访问/swagger/即可查看交互式文档。

通过以上配置和流程,Django可作为高效的后端API服务,与前端框架无缝配合,实现前后端分离的Web应用开发。

相关推荐
Emrys_6 小时前
🚀 深入理解Java并发“王牌”:ConcurrentHashMap
后端
金銀銅鐵6 小时前
[Java] 浅析 Map.of(...) 方法和 Map.ofEntries(...) 方法
java·后端
程序猿20236 小时前
Python每日一练---第三天:删除有序数组中的重复项
开发语言·python
一只游鱼6 小时前
抖音上的用python实现激励弹窗
开发语言·python
Serendipity_Carl6 小时前
爬虫数据清洗可视化链家房源
python·pandas·matplotlib
行走在电子领域的工匠7 小时前
2.2 常用控件
开发语言·python
天才测试猿7 小时前
Selenium三大等待详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
间彧7 小时前
如何通过多阶段构建优化SpringBoot应用的Docker镜像大小?
后端