详细摘要 摘要
生成: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
环境搭建与项目初始化
-
基础环境设置:
- 使用命令行工具(Windows为
cmd,Mac为terminal)进行操作。 - 推荐使用
virtualenvwrapper-win来管理虚拟环境,通过mkvirtualenv <env_name>命令创建并激活。
- 使用命令行工具(Windows为
-
安装核心依赖:
- 在激活的虚拟环境中,通过
pip安装必要的包:pip install Djangopip install djangorestframeworkpip install djangorestframework-simplejwtpip install pillow(用于处理图片上传)pip install gunicorn(用于生产环境部署)
- 在激活的虚拟环境中,通过
-
项目与应用创建:
- 创建Django项目:
django-admin startproject new_jungle_api - 创建Django应用:
python manage.py startapp blog_app - 在
settings.py的INSTALLED_APPS中注册新创建的blog_app和rest_framework。
- 创建Django项目:
自定义用户模型 (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." - 实现步骤:
- 在
blog_app/models.py中,创建一个CustomUser类,继承自django.contrib.auth.models.AbstractUser。 - 在
CustomUser类中添加额外字段,如bio(TextField),profile_picture(ImageField), 以及多个社交链接 (URLField)。 - 在
settings.py中指定新的用户模型:AUTH_USER_MODEL = 'blog_app.CustomUser'。 - 在
admin.py中注册CustomUser模型,以便在后台管理。 - 执行数据库迁移:
python manage.py makemigrations和python manage.py migrate。
- 在
用户注册与JWT认证
-
用户注册 (Sign Up):
- Serializer创建: 在
blog_app/serializers.py中创建UserRegistrationSerializer,它继承自serializers.ModelSerializer。- 该Serializer包含
email,username,password等字段。 - 安全措施:
password字段被设置为{'write_only': True},确保密码不会在API响应中被返回。
- 该Serializer包含
- 重写
.create()方法: 为了正确处理密码,重写了Serializer的create方法,使用user.set_password(password)来对密码进行哈希处理后再保存。 - View创建: 在
views.py中创建一个基于函数的视图register_user,使用@api_view(['POST'])装饰器,仅允许POST请求。 - URL配置: 为
register_user视图配置URL。
- Serializer创建: 在
-
用户登录与认证 (Login & Authentication):
- 集成Simple JWT:
- 在
settings.py中配置REST_FRAMEWORK,将simplejwt的认证类设为默认。 - 在主
urls.py中,包含simplejwt提供的URL路由,用于获取和刷新token:/token/: 用于用户登录,通过POST提交username和password获取access和refreshtoken。/token/refresh/: 用于使用refreshtoken获取新的accesstoken。
- 在
- Token生命周期配置: 在
settings.py中配置了SIMPLE_JWT,通过ACCESS_TOKEN_LIFETIME将访问令牌的有效期从默认的5分钟延长至30分钟。
- 集成Simple JWT:
博客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。
- 自动生成Slug: 重写模型的
- 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请求)。 - 权限:
- 用户必须登录 (
IsAuthenticated)。 - 所有权检查: 在视图逻辑中,明确检查
blog.author == request.user,确保只有博文的作者才能更新该博文。若非作者,则返回403 Forbidden错误。
- 用户必须登录 (
- 视图:
-
删除博文 (Delete):
- 视图:
delete_blog(POST请求,尽管RESTful风格更推荐DELETE方法)。 - 权限: 与更新操作相同,必须是已登录的博文作者本人。
- 视图:
用户个人资料更新
- 功能: 允许已登录用户更新其个人资料中的自定义字段(如
bio,profile_picture, 社交链接等)。 - 实现:
- 创建一个新的
UpdateUserProfileSerializer,包含所有可更新的字段。 - 创建一个
update_user_profile视图(PUT请求),要求用户必须登录。 - 视图逻辑直接获取当前登录用户 (
request.user) 并使用Serializer更新其数据。
- 创建一个新的
API测试
- 教程全程使用Postman(VS Code插件版)来测试API的各个端点。
- 关键测试流程:
- 向
/register_user发送POST请求创建新用户。 - 向
/token/发送POST请求,用用户名和密码获取JWTaccess和refreshtoken。 - 对于需要认证的端点(如创建/更新/删除博文),在请求的Headers中添加
Authorization字段,其值为Bearer <your_access_token>。 - 演示了权限控制的有效性:尝试用一个用户的token去修改另一个用户的博文,会收到
403 Forbidden错误。
- 向
部署到Render.com
-
准备工作:
- 安装
gunicorn作为生产环境的WSGI服务器。 - 通过
pip freeze > requirements.txt生成依赖文件。 - 在
settings.py中配置STATIC_ROOT以收集静态文件。 - 在
settings.py的ALLOWED_HOSTS中添加'*'或Render提供的域名。
- 安装
-
部署脚本:
- 创建一个
build.sh文件,用于在Render服务器上执行一系列命令:pip install -r requirements.txtpython manage.py collectstatic --no-inputpython manage.py migrate
- 创建一个
-
Render.com配置:
- 将项目代码推送到GitHub仓库。
- 在Render上创建一个新的"Web Service",并连接到对应的GitHub仓库。
- Build Command:
sh build.sh - Start Command:
gunicorn new_jungle_api.wsgi:application - 选择免费套餐并部署。
-
最终结果: 成功将Django REST API部署到云端,并获得一个公开可访问的URL,可以通过该URL与API进行交互。