详细摘要 摘要

生成:2025-06-21 19:21

摘要详情

音频文件
2025-02-03 | Code With Clinton | Django Rest Framework Crash Course 2025
摘要类型
详细摘要
LLM 提供商
openai
LLM 模型
gemini-2.5-pro
温度
0.3
已创建
2025-06-21 19:21:19

概览/核心摘要 (Executive Summary)

本内容是对一个关于使用Django和Django REST Framework (DRF) 构建REST API的速成课程的全面总结。该教程由主讲人Clinton(speaker 1)引导,旨在通过一个博客应用的后端项目,从零开始教授学员如何独立、自信地构建并部署一个功能完备的REST API。

教程的核心亮点在于其系统性和实践性。它始于最基础的环境搭建,包括安装Python包(Django, DRF, Pillow, Gunicorn等)和配置虚拟环境。一个关键的最佳实践被反复强调:项目初期就应自定义用户模型(Custom User Model),以增强未来扩展性。随后,教程详细讲解了如何利用DRF的序列化器(Serializers)、视图(Views)和URL配置,实现用户注册功能,并集成了Simple JWT (JSON Web Token) 进行用户认证,确保API的安全性。

项目主体围绕一个博客应用展开,详细实现了完整的CRUD(创建、读取、更新、删除)操作。特别值得注意的是,教程在权限控制方面做得非常细致,例如,只有博文的作者本人才能更新或删除自己的文章。此外,还实现了用户个人资料的更新功能。最后,教程以将后端应用部署到云平台Render.com收尾,涵盖了生产环境配置(如Gunicorn、静态文件处理)和部署流程,使学员能够将所学知识应用于真实世界。整个过程循序渐进,逻辑清晰,为学习者提供了一条从本地开发到线上部署的完整路径。

项目目标与技术栈

  • 最终目标: 构建一个全栈博客应用。
  • 当前系列焦点: 专注于后端REST API的开发。
  • 后续计划: 在完成API后,将使用React构建前端应用来消费此API。
  • 核心技术:
    • 后端框架: Django
    • API框架: Django REST Framework (DRF)
    • 数据库: 默认的SQLite(教程中未明确更换)
    • 认证: Simple JWT (JSON Web Token)
    • 部署: Gunicorn, Render.com

环境搭建与项目初始化

  1. 基础环境设置:

    • 使用命令行工具(Windows为cmd,Mac为terminal)进行操作。
    • 推荐使用virtualenvwrapper-win来管理虚拟环境,通过mkvirtualenv <env_name>命令创建并激活。
  2. 安装核心依赖:

    • 在激活的虚拟环境中,通过pip安装必要的包:
      • pip install Django
      • pip install djangorestframework
      • pip install djangorestframework-simplejwt
      • pip install pillow (用于处理图片上传)
      • pip install gunicorn (用于生产环境部署)
  3. 项目与应用创建:

    • 创建Django项目: django-admin startproject new_jungle_api
    • 创建Django应用: python manage.py startapp blog_app
    • settings.pyINSTALLED_APPS中注册新创建的blog_apprest_framework

自定义用户模型 (Best Practice)

  • 动机: 默认的Django用户模型字段有限,无法满足未来博客应用的需求,如个人简介(bio)、社交媒体链接、头像(profile picture)等。
  • 核心观点: 主讲人强烈建议,在任何Django项目的初期就应该自定义用户模型。
    > "I always recommend that in whatever jungle projects you are working on, is the best pl[ace] for you to always customize your user model... because you don't know what requirements you might need in the future."
  • 实现步骤:
    1. blog_app/models.py中,创建一个CustomUser类,继承自django.contrib.auth.models.AbstractUser
    2. CustomUser类中添加额外字段,如bio (TextField), profile_picture (ImageField), 以及多个社交链接 (URLField)。
    3. settings.py中指定新的用户模型: AUTH_USER_MODEL = 'blog_app.CustomUser'
    4. admin.py中注册CustomUser模型,以便在后台管理。
    5. 执行数据库迁移: python manage.py makemigrationspython manage.py migrate

用户注册与JWT认证

  1. 用户注册 (Sign Up):

    • Serializer创建: 在blog_app/serializers.py中创建UserRegistrationSerializer,它继承自serializers.ModelSerializer
      • 该Serializer包含email, username, password等字段。
      • 安全措施: password字段被设置为{'write_only': True},确保密码不会在API响应中被返回。
    • 重写.create()方法: 为了正确处理密码,重写了Serializer的create方法,使用user.set_password(password)来对密码进行哈希处理后再保存。
    • View创建: 在views.py中创建一个基于函数的视图register_user,使用@api_view(['POST'])装饰器,仅允许POST请求。
    • URL配置: 为register_user视图配置URL。
  2. 用户登录与认证 (Login & Authentication):

    • 集成Simple JWT:
      • settings.py中配置REST_FRAMEWORK,将simplejwt的认证类设为默认。
      • 在主urls.py中,包含simplejwt提供的URL路由,用于获取和刷新token:
        • /token/: 用于用户登录,通过POST提交usernamepassword获取accessrefresh token。
        • /token/refresh/: 用于使用refresh token获取新的access token。
    • Token生命周期配置: 在settings.py中配置了SIMPLE_JWT,通过ACCESS_TOKEN_LIFETIME将访问令牌的有效期从默认的5分钟延长至30分钟。

博客API - CRUD功能实现

模型与序列化器

  • Blog模型: 在models.py中创建Blog模型,包含以下字段:
    • title, content, category (使用Choices), featured_image (ImageField)。
    • author: ForeignKey关联到CustomUser模型。
    • slug: SlugField,用于生成对SEO友好的URL。
    • is_draft: BooleanField,默认为True,用于控制博文是否发布。
    • created_at, updated_at, published_time: 记录时间戳。
  • 自动化逻辑:
    • 自动生成Slug: 重写模型的save()方法,使用slugify根据title自动生成唯一的slug。代码中包含了处理slug冲突的逻辑。
    • 自动记录发布时间: 在save()方法中,当is_draft字段从True变为False时,自动记录当前的published_time
  • Blog序列化器:
    • 创建BlogSerializer,并使用一个嵌套的SimpleAuthorSerializer来序列化author字段,使其返回作者的详细信息(如用户名、姓名),而不仅仅是ID。
    • author字段被设为read_only=True,因为其值将从请求的用户中自动获取,而非由客户端提供。

视图与权限控制 (Views & Permissions)

  • 创建博文 (Create):

    • 视图: create_blog (POST请求)。
    • 权限: 使用@permission_classes([IsAuthenticated])装饰器,强制要求用户必须登录才能创建博文。
    • 逻辑: 在保存时,自动将author字段设置为当前登录用户 (request.user)。
  • 读取博文列表 (Read - List):

    • 视图: blog_list (GET请求)。
    • 权限: 无特殊权限,任何人都可以查看博文列表。
  • 更新博文 (Update):

    • 视图: update_blog (PUT请求)。
    • 权限:
      1. 用户必须登录 (IsAuthenticated)。
      2. 所有权检查: 在视图逻辑中,明确检查blog.author == request.user,确保只有博文的作者才能更新该博文。若非作者,则返回403 Forbidden错误。
  • 删除博文 (Delete):

    • 视图: delete_blog (POST请求,尽管RESTful风格更推荐DELETE方法)。
    • 权限: 与更新操作相同,必须是已登录的博文作者本人。

用户个人资料更新

  • 功能: 允许已登录用户更新其个人资料中的自定义字段(如bio, profile_picture, 社交链接等)。
  • 实现:
    1. 创建一个新的UpdateUserProfileSerializer,包含所有可更新的字段。
    2. 创建一个update_user_profile视图(PUT请求),要求用户必须登录。
    3. 视图逻辑直接获取当前登录用户 (request.user) 并使用Serializer更新其数据。

API测试

  • 教程全程使用Postman(VS Code插件版)来测试API的各个端点。
  • 关键测试流程:
    1. /register_user发送POST请求创建新用户。
    2. /token/发送POST请求,用用户名和密码获取JWT accessrefresh token。
    3. 对于需要认证的端点(如创建/更新/删除博文),在请求的Headers中添加Authorization字段,其值为Bearer <your_access_token>
    4. 演示了权限控制的有效性:尝试用一个用户的token去修改另一个用户的博文,会收到403 Forbidden错误。

部署到Render.com

  • 准备工作:

    1. 安装gunicorn作为生产环境的WSGI服务器。
    2. 通过pip freeze > requirements.txt生成依赖文件。
    3. settings.py中配置STATIC_ROOT以收集静态文件。
    4. settings.pyALLOWED_HOSTS中添加'*'或Render提供的域名。
  • 部署脚本:

    • 创建一个build.sh文件,用于在Render服务器上执行一系列命令:
      • pip install -r requirements.txt
      • python manage.py collectstatic --no-input
      • python manage.py migrate
  • Render.com配置:

    1. 将项目代码推送到GitHub仓库。
    2. 在Render上创建一个新的"Web Service",并连接到对应的GitHub仓库。
    3. Build Command: sh build.sh
    4. Start Command: gunicorn new_jungle_api.wsgi:application
    5. 选择免费套餐并部署。
  • 最终结果: 成功将Django REST API部署到云端,并获得一个公开可访问的URL,可以通过该URL与API进行交互。