从零到一:Django入门实战,搭建我的第一个网站
引言:为什么选择Django?

去年年初,我刚从学校毕业加入一家创业公司,负责开发内部的管理后台。当时团队小、节奏快,要求能快速交付可用的产品原型。作为刚入行的后端新人,我在技术选型上犯了难:PHP?Flask?还是Node.js?最终,在一位资深同事的建议下,我选择了Django。
不是因为它是“最流行”的Python Web框架,而是因为它足够成熟、功能完备、开发效率高。最重要的是——它非常适合像我这样刚起步的开发者。于是,我用了不到一周的时间,就用 Django 搭建起了一个基础的用户管理和内容发布系统。
这篇文章就想和大家分享一下那次的经历,以及我个人在使用 Django 过程中踩过的坑和学到的经验。如果你是 Python 爱好者,或者正打算入门 Web 开发,希望这篇文章能带你顺利迈出第一步。
问题描述:现实中的挑战

项目背景其实很简单:我们是一家做线上课程内容的初创公司,需要一套后台系统来管理讲师信息、课程目录、内容发布、权限控制等基本功能。
但一开始我就遇到了几个现实问题:
- 时间紧任务重:两周内必须完成 MVP(最小可行性产品),否则影响市场推广。
- 没有太多开发经验:我虽然是 CS 专业出身,但在真实业务场景下写完整项目还是第一次。
- 缺乏运维经验:本地运行没问题,但部署上线是个大难题。
- 数据模型设计不清:不知道如何合理地组织模型结构,避免未来改表、迁移麻烦。
- 接口设计不够规范:初期没考虑好 RESTful 规范,导致后期重构痛苦。
这些问题看起来可能不大,但对于一个新手来说,每一步都像在迷宫里摸索前行。
解决方案:为何选Django?
Django 最大的优势在于其“开箱即用”的理念,非常适合中小型项目的快速开发。以下是让我坚定选择它的几个理由:
1. ORM 非常友好
Django 自带的 ORM 让数据库操作变得简单直观,不用手动写 SQL。比如定义一个用户模型,只需要几行代码:
from django.db import models
class User(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.username
2. Admin 后台自带
这是我最喜欢的点之一。Django 提供了一个现成的后台管理界面,只需要注册模型,就能实现CRUD操作,这对于管理类系统简直太香了。
# admin.py
from django.contrib import admin
from .models import Course, Teacher, Category
admin.site.register(Course)
admin.site.register(Teacher)
admin.site.register(Category)
3. 架构清晰,易于扩展
MVT架构(Model-View-Template)让前后端逻辑分离清楚,也利于多人协作。即使后来我们要加API服务,也只是新增一个 views.py 文件的事儿。
4. 社区强大,资料丰富
当你遇到某个插件或报错时,几乎都能在 Stack Overflow 或 GitHub 上找到答案。这对初学者来说简直是救命稻草。
代码实践:动手搭起来
为了让大家有一个更清晰的体验,下面我们以一个简化的“课程管理系统”为例,走一遍完整的搭建流程。
第一步:创建项目
安装 Django:
pip install django
创建项目:
django-admin startproject course_manager
cd course_manager
python manage.py startapp courses
别忘了在 settings.py 中添加你新建的 app 到 INSTALLED_APPS 里面:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'courses', # 添加这一行
]
第二步:定义模型
打开 courses/models.py,编写课程相关的数据模型:
from django.db import models
class Teacher(models.Model):
name = models.CharField(max_length=100)
bio = models.TextField()
def __str__(self):
return self.name
class Course(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
然后生成数据库迁移文件并应用:
python manage.py makemigrations
python manage.py migrate
第三步:注册Admin
编辑 courses/admin.py:
from django.contrib import admin
from .models import Course, Teacher
admin.site.register(Course)
admin.site.register(Teacher)
启动服务器访问后台:
python manage.py runserver
浏览器打开 http://localhost:8000/admin,登录后就可以看到自动生成的管理界面了!
第四步:写个简单的前端页面
Django 的模板引擎也很方便。假设我们要展示所有课程:
创建模板目录:courses/templates/courses/course_list.html
<!-- courses/templates/courses/course_list.html -->
<h1>课程列表</h1>
<ul>
{% for course in courses %}
<li>{{ course.title }} - {{ course.teacher.name }}</li>
{% endfor %}
</ul>
然后写视图函数:
# views.py
from django.shortcuts import render
from .models import Course
def course_list(request):
courses = Course.objects.all().select_related('teacher')
return render(request, 'courses/course_list.html', {'courses': courses})
配置 URL 路由:
# urls.py
from django.urls import path
from courses.views import course_list
urlpatterns = [
path('', course_list),
]
现在访问 http://localhost:8000/ 就能看到你的第一个页面了!
踩坑经验:真实开发中的那些事
说实话,当初我踩了不少坑。现在回想起来,有些甚至是“低级错误”,但也正因为这些教训,我才真正理解了 Django 的设计理念。
坑1:ORM 查询写法不规范,性能差得惊人
刚开始不懂优化查询,直接在循环里调用 .objects.get(),结果数据库响应超慢。后来学到了:
- 使用
.select_related()和.prefetch_related()减少数据库查询次数; - 合理使用分页
.paginate_by()控制返回条数; - 对于高频查询字段加索引(如教师ID);
例如上面例子中我用了 .select_related('teacher') 来预加载外键对象,避免N+1查询。
坑2:静态资源不会配,部署完样式全乱
这是每个 Django 新人都会遇到的问题。特别是生产环境下,Django 不处理静态文件(比如 CSS/JS/images),需要你配置 nginx,或者使用 whitenoise 这样的中间件。
建议早期就在开发环境中模拟生产行为,提前练手。
# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
然后执行:
python manage.py collectstatic
部署时把 static 目录交给 Nginx 处理,Django 只专注处理动态请求即可。
坑3:权限校验不严谨,出了安全漏洞
有一次误将某些只有管理员才能看的数据暴露给普通用户。后来学到了:
- 使用 Django 内置的
@login_required装饰器; - 对敏感操作加上权限判断
if not request.user.is_staff: return HttpResponseForbidden(); - 使用
PermissionRequiredMixin类简化权限控制;
坑4:数据库模型设计不合理,频繁修改表结构
初期没规划好主键类型、索引关系,后期动不动就要跑迁移脚本,甚至出错卡死。后来养成习惯:
- 用 UUID 替代默认的 auto-increment ID;
- 把经常一起查询的字段放在一张表里;
- 使用
on_delete=models.SET_NULL或PROTECT明确关联删除行为;
效果总结:上线后的收获
经过两周奋战,我们的后台系统终于如期上线。虽然功能不算复杂,但它解决了三个核心问题:
- 管理员可以轻松上传课程内容、管理讲师信息;
- 实现了用户角色划分(管理员、运营、编辑);
- API 接口可被前端项目调用,支持后续移动端开发;
更重要的是,这个项目帮我建立起对 Web 开发的系统认知,尤其是以下几个方面:
- 工程思维的建立:从需求分析 → 数据库设计 → 接口联调 → 部署上线,整个流程有了初步理解;
- 团队协作意识:虽然一个人做的,但也意识到命名规范、文档记录的重要性;
- 对框架的理解更深入:不再是照着教程敲代码,而是知道什么时候该用什么模块;
经验分享:给新人的一些建议

如果你刚开始接触 Django 或者后端开发,以下几点希望你能少走弯路:
✅ 1. 先掌握 Python 基础语法
不要急于上来就写 Web 项目,先把 list/dict/class/装饰器这些基础概念搞明白,不然遇到 bug 都不知道哪里查起。
✅ 2. 从小项目练手
比如先做个博客系统、留言板、任务清单之类的,练练模型、模板、视图之间的配合。
✅ 3. 学会调试工具
Chrome Dev Tools、Postman、PyCharm Debugger 都要熟悉。特别是 Django 的 logging 和 shell 工具,排查错误非常有用。
✅ 4. 注重代码结构与注释
即使是小项目,也要有清晰的模块划分、合理的命名。日后维护你会感谢自己。
✅ 5. 早点尝试部署
不要只停留在本地 runserver。尝试用 Gunicorn + Nginx 配合部署,哪怕只是跑在阿里云 ECS 上也好。
结语:Django 让我爱上了后端开发
如今我已经用 Django 做了四个正式上线的项目,也逐渐从“搬砖”变成能主导架构设计的角色。
Django 并非万能,但在中小型系统开发中,它绝对是首选。它不会让你陷入复杂的底层细节,又能通过良好的设计模式教会你写出健壮、易维护的代码。
希望这篇结合我个人经历的入门教程,能让更多人勇敢迈出 Python Web 开发的第一步。毕竟,“写代码不怕笨,怕不写”。
愿你在编程路上越走越远,少一些焦虑,多一份热爱。

评论 0