从零搭建你的第一个Django网站:一个前端出身的AI工具博主的后端初体验
上周五晚上十点半,我正蹲在公司楼下的全家便利店啃饭团,突然收到产品经理的消息:“能不能先搭个简单的后台原型?下周三演示用。”
我当时差点把饭团捏碎——毕竟,我的主战场是前端,最近还在沉迷Rust的ownership机制,哪有时间搞Python后端?
但转念一想:这不正好是个机会吗?一直听说Django“自带轮子多”、“开箱即用”,不如趁这个需求,亲手搭个真正的网站试试。于是周六一早8点,我泡好咖啡,打开VS Code,正式开启了我的Django初体验。
为什么选Django?一个被Go“诱惑”过的程序员的选择
说实话,最近团队里吹Go的风特别大。隔壁组用Gin框架三天搭了个API服务,性能跑分吊打我们老Python项目。我也一度心动,甚至本地装了Go环境,写了个Hello World。但冷静下来一想:这次要的是快速交付,不是极致性能。
Django的优势太明显了:
- 自带Admin后台(省掉至少两天开发)
- ORM抽象了数据库操作(我不用再手写SQL防注入)
- 开发服务器热重载(改完代码不用重启)
- 社区文档巨全(Stack Overflow上90%的问题都有答案)
更重要的是——它对新手极其友好。作为一个常年和React、Vue打交道的“前端仔”,我需要的是能让我快速看到成果的工具,而不是在配置文件里迷失三天。
环境准备:别让第一步就劝退你
很多人卡在第一步:Python版本、虚拟环境、pip安装…… 我直接上命令(我用的是macOS + pyenv,Windows用户请自行替换):
# 创建项目目录
mkdir my_first_django && cd my_first_django
# 使用pyenv(可选)确保Python 3.10+
pyenv local 3.11.5
# 创建虚拟环境(强烈推荐!)
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装Django(当前最新稳定版4.2)
pip install django
📌 实战经验提醒:千万别全局装Django!我去年就因为全局装包导致两个项目依赖冲突,凌晨三点还在修环境,差点被运维拉黑。
验证安装成功:
django-admin --version
# 输出类似:4.2.7
第一行代码:比“Hello World”更有成就感
Django的哲学是“约定优于配置”,所以它提供了一套标准项目结构。我们用命令生成骨架:
django-admin startproject mysite .
注意那个 . —— 很多人漏掉它,结果项目嵌套两层目录,后期部署时哭都来不及。
接着启动开发服务器:
python manage.py runserver
浏览器打开 http://127.0.0.1:8000,看到那只可爱的火箭图标了吗?恭喜,你的第一个Django站点跑起来了!
添加一个“博客”功能:从前端视角理解MVT
作为前端,我习惯把页面拆解成组件。而Django用的是 MVT 模式(Model-View-Template),其实和MVC很像:
- Model:数据结构(对应数据库表)
- View:业务逻辑(处理请求、返回响应)
- Template:前端模板(HTML + Django模板语法)
1. 创建App
Django项目由多个App组成。我们创建一个叫 blog 的App:
python manage.py startapp blog
然后在 mysite/settings.py 的 INSTALLED_APPS 里注册它:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# ... 其他默认项
'blog', # ← 加这一行
]
2. 定义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
这里有个坑:外键关联User时,on_delete=models.CASCADE 很重要。意思是如果用户被删,他的文章也一起删——否则数据库会报错。
3. 生成并执行数据库迁移
Django用迁移文件管理数据库变更:
python manage.py makemigrations
python manage.py migrate
这两条命令会自动在SQLite(默认数据库)中创建表。生产环境建议换PostgreSQL,但入门用SQLite完全够用。
4. 注册到Admin后台(超爽的功能!)
在 blog/admin.py 中:
from django.contrib import admin
from .models import Post
admin.site.register(Post)
然后创建超级用户:
python manage.py createsuperuser
按提示输入用户名、邮箱、密码。之后访问 http://127.0.0.1:8000/admin,用刚创建的账号登录——天呐!一个完整的后台管理系统自动生成了! 我可以在这里增删改文章,连富文本编辑器都不用写。
💡 真实感吐槽:当年我在某创业公司,光是写这种CRUD后台就花了两周。现在Django五分钟搞定,真香!
写个前端页面:Django模板 vs 现代前端框架
我知道你在想:“这模板语法是不是太原始了?”
确实,Django模板没有React那么灵活,但对于简单页面完全够用。比如展示文章列表:
创建 blog/templates/blog/post_list.html:
<!DOCTYPE html>
<html>
<head>
<title>我的博客</title>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.post { margin-bottom: 20px; padding: 15px; border-left: 4px solid #007bff; }
</style>
</head>
<body>
<h1>所有文章</h1>
{% for post in posts %}
<div class="post">
<h2>{{ post.title }}</h2>
<p><small>作者: {{ post.author.username }} | {{ post.created_at|date:"Y-m-d H:i" }}</small></p>
<p>{{ post.content|truncatewords:30 }}</p>
</div>
{% empty %}
<p>暂无文章。</p>
{% endfor %}
</body>
</html>
然后在 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/post_list.html', {'posts': posts})
最后配置URL路由(blog/urls.py + mysite/urls.py),页面就能访问了。
🤔 前端视角思考:如果你要做复杂交互(比如实时评论、拖拽排序),建议Django只做API后端,前端用Vue/React单独开发。但如果是内容展示型网站(如博客、企业官网),Django模板+少量JS完全够用,还能省掉跨域、部署等问题。
性能与部署:别只顾着本地跑得欢
很多新手教程到这就结束了,但真正的挑战在上线。
数据库优化小贴士
- 给经常查询的字段加索引(比如
title) - 避免N+1查询:用
select_related()或prefetch_related() - 示例:获取文章及其作者信息时
# 坏:每次循环都查一次User表
posts = Post.objects.all()
# 好:一次JOIN搞定
posts = Post.objects.select_related('author').all()
部署到生产环境
我用的是 Gunicorn + Nginx + PostgreSQL 组合(上海租房党表示云服务器月付100块真的香):
| 组件 | 作用 |
|---|---|
| Gunicorn | Python WSGI HTTP服务器 |
| Nginx | 反向代理 + 静态文件服务 |
| PostgreSQL | 生产级数据库 |
关键配置片段(gunicorn.conf.py):
bind = "0.0.0.0:8000"
workers = 4 # CPU核心数 * 2 + 1
timeout = 120
⚠️ 血泪教训:千万别在生产环境用Django自带的runserver!它单线程、无安全加固,扛不住真实流量。
回到“代码人生”:为什么我要学Django?
写这篇文章的时候,窗外是上海阴沉的梅雨天。我租的房子离公司步行10分钟,桌上还放着没喝完的瑞幸。最近研究Rust让我对系统编程着迷,但现实是——大多数业务需求,根本不需要造轮子。
Django教会我的不是某个框架的用法,而是如何用最小成本解决实际问题。当产品经理说“周三要演示”,我能花一个周末交付可用原型;当朋友想做个个人博客,我可以半小时帮他搭好。
这大概就是“代码人生”的真相:技术没有高低贵贱,只有适不适合。Go固然快,Rust固然安全,但Django能让我今晚准时下班——这才是打工人最珍贵的奢侈品。
最后的小建议
如果你是前端想学后端:
- 别一上来就纠结“Flask vs FastAPI vs Django”
- 先用Django跑通一个完整流程(模型→视图→模板→部署)
- 再横向对比其他框架,你会有更深体会
如果你是纯新手:
- 别怕看英文文档(Django官方文档是业界标杆)
- 遇到报错先复制错误信息搜Stack Overflow
- 记住:每个大神都曾被“ModuleNotFoundError”折磨过
现在,去创建你的第一个Django项目吧。说不定下周,你也能在全家便利店一边啃饭团,一边淡定回复产品经理:“后台搞定了,地址发你了。”

评论 0