Django入门教程:搭建你的第一个Python网站
上周五晚上十点半,我刚从公司打完卡出来,北京的晚风带着初秋的凉意。地铁13号线上人不多,耳机里放着播客,脑子里却还在复盘今天下午那个突发故障——一个上游Java服务的线程池满了,把我们前端的接口拖垮了。虽然最后是后端兄弟背的锅,但我心里清楚,如果我自己能多懂点后端逻辑,至少能更快定位问题。
这事让我意识到:作为一个在阿里摸爬滚打好几年、经历过三次双11大促洗礼的P7前端工程师,光会写React和搞性能优化已经不够了。尤其是在我们团队现在大力推行“全栈化”、“前后端协同设计”的背景下,不懂点后端,开会时连产品经理画的架构图都看不懂(别笑,真有这种情况)。
所以,我决定系统性地学一门后端语言和框架。Go?太卷了,隔壁组天天吹“云原生”,搞得我压力山大。Java?虽然我们系统里Java服务遍地开花,但那套Spring Boot + MyBatis的组合拳,配置起来能把人绕晕,而且学习曲线陡峭得像西二旗早高峰的地铁扶梯。
思来想去,我选了 Django —— 一个用 Python 写的 Web 框架。为什么?简单、高效、自带Admin后台,对新手极其友好。更重要的是,Python 的语法简洁到让我这个常年和 JavaScript 打交道的人倍感亲切。上周六,趁着周末,我花了半天时间,搭了个最简单的博客网站。过程虽短,但踩的坑不少,收获也满满。今天就借着这篇“技术分享”,把我的入门经验总结一下,希望能帮到同样想跨界的前端兄弟们。
为啥是 Django?而不是 Flask 或 FastAPI?
先说结论:Django 是“开箱即用”的最佳选择。
Flask 虽然轻量灵活,但你需要自己拼装 ORM、认证、Admin 等模块,对新手来说容易迷失在各种第三方库的选择中。FastAPI 性能确实猛,异步支持好,但生态还不够成熟,文档也不如 Django 完善。
而 Django,官方号称 “The web framework for perfectionists with deadlines” —— 这不就是我们互联网人的写照吗?产品明天就要上线,你告诉我数据库还没建?Django 自带的 manage.py 命令行工具和 Admin 后台,能让你在20分钟内搞定一个可运行的原型。
小插曲:上周我们组有个实习生被安排做个内部工具,他一开始用 Go 写,结果三天过去了连用户登录都没调通。我建议他换成 Django,第二天他就跑来跟我说:“哥,这玩意儿也太香了吧!”
下面这张表对比了几个主流 Python Web 框架的关键特性:
| 特性 | Django | Flask | FastAPI |
|---|---|---|---|
| ORM | 内置(强大) | 需集成 SQLAlchemy | 需集成 SQLAlchemy / Tortoise |
| Admin 后台 | ✅ 自带 | ❌ | ❌ |
| 用户认证 | ✅ 内置 | 需手动实现 | 需手动实现 |
| 学习曲线 | 中等 | 低(但后期复杂) | 中高(需理解异步) |
| 适合场景 | 全功能 Web 应用 | 微服务 / API | 高性能 API |
看到没?如果你要做一个完整的网站(哪怕只是内部工具),Django 的“电池已包含”哲学真的能救命。
动手!从零开始搭个博客
第一步:环境准备
首先确保你装了 Python(建议 3.8+)。然后创建虚拟环境(别污染全局环境,这是基本素养):
python -m venv myblog_env
source myblog_env/bin/activate # Linux/Mac
# myblog_env\Scripts\activate # Windows
pip install django
吐槽一句:我们运维同学总说“你们开发能不能别乱装包”,其实只要用虚拟环境,根本不会影响系统。但每次上线前他们还是要扫一遍依赖,搞得我像在做代码人生里的“合规考试”。
第二步:创建项目和应用
Django 的“项目(Project)”和“应用(App)”概念要分清。一个项目可以包含多个应用。比如你的电商网站,可能有 user、product、order 等多个 App。
django-admin startproject mysite
cd mysite
python manage.py startapp blog
这时候目录结构大概是这样:
mysite/
├── manage.py
├── mysite/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── blog/
├── migrations/
├── models.py
├── views.py
└── ...
第三步:定义模型(Model)
我们想做一个简单的博客,每篇文章有标题、内容、发布时间。编辑 blog/models.py:
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
这里用了 Django 内置的 User 模型做外键,省去了自己写用户系统的麻烦——又是一个“偷懒”的好例子。
然后生成并执行迁移:
python manage.py makemigrations
python manage.py migrate
血泪教训:去年双11前,我们有个同事改了模型字段但忘了
makemigrations,结果线上数据库结构和代码不一致,半夜报警。从那以后,我们 CI 流程里加了一条:检测是否有未提交的 migration 文件。
第四步:注册到 Admin 后台
这是 Django 最爽的功能之一!编辑 blog/admin.py:
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'created_at')
search_fields = ('title', 'content')
再创建超级用户:
python manage.py createsuperuser
启动服务:
python manage.py runserver
访问 http://127.0.0.1:8000/admin,输入刚才创建的账号,你就能看到一个功能完整的后台管理系统!增删改查、搜索、分页,全都有。这要是用 Java 手写,估计得两天。
写个前端页面:别怕,Django 模板很友好
虽然我是前端,但在 Django 里写模板居然没那么痛苦。编辑 blog/views.py:
from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'blog/list.html', {'posts': posts})
然后在 blog/ 下创建 templates/blog/list.html:
<!DOCTYPE html>
<html>
<head>
<title>我的博客</title>
</head>
<body>
<h1>最新文章</h1>
{% for post in posts %}
<div>
<h2>{{ post.title }}</h2>
<p>作者:{{ post.author.username }} | {{ post.created_at }}</p>
<p>{{ post.content|truncatewords:30 }}</p>
</div>
{% empty %}
<p>暂无文章。</p>
{% endfor %}
</body>
</html>
Django 模板语言(DTL)虽然不如 JSX 灵活,但逻辑清晰,安全(自动转义防 XSS),对快速原型足够了。
别忘了配置 URL 路由。在 blog/urls.py(需要新建):
from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
然后在 mysite/urls.py 中 include:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
刷新页面,你的博客首页就出来了!
生产环境?别急,先考虑这些
虽然本地跑起来了,但离上线还差得远。作为经历过多次线上事故的老兵,我必须提醒几点:
- 不要用
runserver上生产!它只是开发服务器,性能极差。要用 Gunicorn + Nginx。 - 数据库别用 SQLite!开发可以,生产必须上 PostgreSQL 或 MySQL。
- 静态文件处理:Django 的
STATICFILES_DIRS只适合开发。生产环境要用 CDN 或配置 Nginx 托管。 - 安全设置:务必关闭
DEBUG=True,设置ALLOWED_HOSTS,启用 HTTPS。
我们团队现在上新服务,必须通过安全扫描和压测。有一次我忘关 DEBUG,被安全团队邮件通报,社死现场。
为什么前端学后端?不只是为了跳槽
说实话,我学 Django 最初动机确实有点功利——看招聘要求,全栈工程师薪资普遍高 20%。但真正动手后,我发现更大的价值在于 沟通效率的提升。
以前和 Java 后端联调,他们说“这个接口返回的是 DTO 对象”,我一脸懵。现在我能看懂他们的 Entity 和 Repository,甚至能提建议:“这个字段要不要加索引?”、“分页参数能不能统一成 page 和 size?”
上周和 Go 组对接一个新功能,对方用 Protobuf 定义接口。因为我自己搭过后端,一眼看出他们少传了一个必要字段,避免了一次返工。产品经理当场夸我“技术视野广”——虽然我知道他只是想让我多干活。
代码人生,不只是写代码,更是理解系统如何协作。
总结:Django 适合谁?
- 前端想拓展技能边界:语法友好,上手快,能快速验证想法。
- 学生或个人开发者:想做个 MVP 项目,Django 能帮你省下 80% 的样板代码。
- 内部工具开发者:Admin 后台简直是神器,比 Excel 强一百倍。
当然,Django 也不是万能的。如果你要做高并发微服务,Go 或 Java 可能更合适。但如果你的目标是“快速做出一个功能完整的网站”,Django 绝对是 Python 阵营里最稳的选择。
最后送大家一句我在技术分享会上常说的:“工具没有高低贵贱,解决问题才是王道。” 别纠结语言之争,Java、Go、Python,都是我们手中的武器。重要的是,你是否能在 deadline 前,把产品平安送上线。
—— 就像今年双11,不管用什么技术,只要用户能顺利下单,我们就能安心吃庆功宴(虽然大概率还是在公司吃泡面)。
Happy coding!

评论 0