Django 入门实战:从零搭建你的第一个 Python 网站
引子:为什么选择 Django?

作为一名后端开发者,我已经在实际项目中使用 Django 多年。第一次接触它的时候,是被它“开箱即用”的理念深深吸引。相比其他框架需要手动配置大量组件,Django 把大部分后端开发流程都帮你做好了,让你可以把精力集中在业务逻辑本身。
今天我想通过一个真实的项目场景,带你一步步了解如何使用 Django 搭建自己的第一个网站。我会结合自己早期工作中的经验、踩过的坑和收获分享一些实用技巧,并尽量还原真实开发过程中的点滴。
项目背景:一个小而完整的博客系统

去年我刚入职一家小型创业公司时,被安排做一个内部使用的知识管理系统。说白了就是个简易博客平台,支持发布文章、分类管理、用户权限控制等功能。时间紧迫,两周内上线 MVP。
需求简述:
- 支持管理员撰写并发布文章
- 文章可按分类浏览
- 支持访客评论功能
- 用户分级(普通访客 vs 管理员)
- 数据可视化(统计每周发布量)
考虑到时间和团队技术栈,我们最终决定采用 Django 快速搭建。事实证明,在这个场景下,Django 的表现超出预期。
开发准备阶段

在动手上代码之前,首先要确认好几点:
- Python 环境 —— 建议使用
Python 3.8+,目前 Django 官方支持到3.2.x。 - 虚拟环境 —— 每个项目单独建立
venv,确保依赖隔离。 - 项目结构规划 —— 初期就定好 app 划分策略,避免后期难以拆解。
# 创建项目目录和虚拟环境
mkdir my_blog_project
cd my_blog_project
python -m venv env
source env/bin/activate
pip install django
安装完成后,就可以创建项目和应用了:
django-admin startproject blog_project .
python manage.py startapp blog
现在项目结构大概是这样的:
my_blog_project/
├── blog/
├── blog_project/
├── env/
├── manage.py
核心挑战一:数据库设计怎么做才不踩坑?

在实际工作中,最怕的就是初期设计随意,导致后面频繁重构。因此一开始就要认真对待模型定义。比如我们的博客系统核心实体有以下几个:
- 文章(Article)
- 分类(Category)
- 用户(User)
- 评论(Comment)
模型示例:
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100, unique=True)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
经验点:
- 外键关系要清晰:例如,文章属于某个分类,删除分类时可以考虑是否允许为空 (
on_delete=models.SET_NULL)。 - 时间字段一定要加:
created_at和updated_at对于运营数据分析非常关键。 - 模型描述建议加上
__str__方法:这样在 admin 后台或者调试时更直观。
使用 Django Admin 提升效率
Django 自带的 admin 接口真的太省事了!我们只需要注册一下模型即可实现后台增删改查操作,对于内容编辑人员来说非常友好。

示例代码:
# blog/admin.py
from django.contrib import admin
from .models import Article, Category, Comment
admin.site.register(Category)
admin.site.register(Article)
admin.site.register(Comment)
访问 /admin 登录后就可以看到自动构建的界面。如果你希望自定义展示格式,也可以扩展 ModelAdmin 类来定制列表页显示、过滤等细节。
构建 API 接口:前后端分离的起点
虽然这是一个简单的博客系统,但未来可能会接入移动端或小程序。因此我们提前埋下了 RESTful 风格的 API 接口设计。
技术选型:Django REST Framework (DRF)
DRF 是 Django 最常用的 API 插件库,能帮助我们快速生成接口。这里给出一个简单的文章接口示例:
序列化器(Serializer)
# blog/serializers.py
from rest_framework import serializers
from .models import Article, Category
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name']
class ArticleSerializer(serializers.ModelSerializer):
category = CategorySerializer(read_only=True)
class Meta:
model = Article
fields = ['id', 'title', 'content', 'author', 'category', 'created_at']
视图函数
# blog/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Article
from .serializers import ArticleSerializer
class ArticleListView(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
URL 配置
# blog/urls.py
from django.urls import path
from .views import ArticleListView
urlpatterns = [
path('api/articles/', ArticleListView.as_view()),
]
再加上全局路由引入:
# blog_project/urls.py
from django.urls import include, path
urlpatterns = [
...
path('', include('blog.urls')),
]
这样我们就有了一个 GET 获取所有文章的接口,后续还可以加入身份验证、分页、搜索、排序等功能。
路由与视图:写 Web 页面也要讲究套路
除了 API 接口,我们还需要页面级的前端展示。Django 的模板引擎其实也很强大,尤其适合中小型项目。
模板目录结构:
blog/
├── templates/
│ └── blog/
│ ├── index.html
│ ├── article_detail.html
│ └── base.html
views 示例:
# blog/views.py
from django.shortcuts import render
from .models import Article
def home(request):
articles = Article.objects.all().order_by('-created_at')[:5]
return render(request, 'blog/index.html', {'latest_articles': articles})
def article_detail(request, pk):
try:
article = Article.objects.get(pk=pk)
except Article.DoesNotExist:
raise Http404("文章不存在")
return render(request, 'blog/article_detail.html', {'article': article})
再配上对应的 URL:
# blog/urls.py
from django.urls import path
from .views import home, article_detail
urlpatterns = [
path('', home, name='home'),
path('article/<int:pk>/', article_detail, name='article-detail'),
]
这基本上就是一个完整的页面结构了,剩下的就是 HTML + CSS 渲染。
实战踩坑记录 & 解决方案
以下是一些我在实际开发过程中遇到的问题和应对方法:
❌ 问题1:迁移文件冲突或失败
现象: 数据库迁移时报错,提示无法创建表或已有列存在。
解决思路:
- 检查是否有人动了原来的迁移文件。
- 使用
makemigrations --empty <app>新建空白迁移进行调整。 - 如果确定没问题可以直接清理 migrations 文件夹并重新运行。
❌ 问题2:静态资源加载失败
现象: 开发环境下静态文件(CSS/JS)加载 404。
解决方案:
- 确保在设置里配置好了
STATIC_URL和STATIC_ROOT - 添加中间件
'django.middleware.common.CommonMiddleware' - 使用
{% load static %}和<link rel="stylesheet" href="{% static 'style.css' %}">这种语法加载资源
❌ 问题3:生产环境部署出错
现象: 上线后出现数据库连接错误、权限问题等。
解决办法:
- 生产设置务必使用
.env或者环境变量管理敏感信息(如 SECRET_KEY、数据库密码) - 使用
gunicorn + nginx替代开发服务器(runserver) - 记得跑一遍
collectstatic把静态资源集中处理
性能优化初探

尽管只是个小型博客系统,但从一开始就应关注性能。以下是几个常见的优化点:
✅ 缓存优化
使用缓存减少数据库压力是一个通用手段。Django 提供了多种缓存机制,比如 Redis。
# 设置 cache backend(settings.py)
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
}
}
然后在 view 中使用:
from django.core.cache import cache
def home(request):
key = 'latest_articles'
articles = cache.get(key)
if not articles:
articles = Article.objects.all().order_by('-created_at')[:5]
cache.set(key, articles, timeout=300) # 缓存五分钟
return render(request, 'blog/index.html', {'latest_articles': articles})
✅ 查询优化
- 使用
.select_related()或.prefetch_related()来优化 ForeignKey 查询 - 避免在模板中执行 N+1 查询
- 使用
QuerySet批量操作代替循环更新/插入数据
效果总结:一次成功的尝试
项目如期上线,两周内完成了 MVP,并且顺利交付给了公司内部用户使用。由于采用 Django,开发效率大大提高,同时也为后续维护提供了良好的基础。
几个月后,当我们要增加新的功能模块(比如标签系统、推荐算法)时,发现整个项目的结构清晰,模块划分合理,大大减少了开发成本。
我的 Django 使用经验总结
回顾这几年的 Django 使用经历,我总结了几条实用建议:
- 不要小看内置工具:admin、auth、forms、cache、sessions 等都是多年打磨下来的经典组件。
- 坚持合理的工程实践:版本控制、单元测试、CI/CD 流程尽早引入。
- 注意项目结构清晰:多个 app 划分合理,各司其职。
- 多看看社区最佳实践:比如 Cookiecutter-Django、Django Girls 教程、Two Scoops of Django 等书籍。
- 学会取舍:Django 功能虽强,但在某些场景(如高并发微服务),可能更适合搭配 FastAPI、Go 等技术栈。
结语:技术的成长永远来自实践
这篇文章讲的是我早期在公司做一个内部博客系统的完整过程。虽然简单,但它教会我如何快速地把一个想法变成可用的产品,也让我认识到,好的工具能让人专注于创造价值而不是重复造轮子。
如果你是刚刚起步的开发者,别担心复杂的概念。Django 不仅仅是框架,它是一种思维方式——一种“高效解决问题”的方式。只要愿意动手试,你就能感受到它的魅力。
最后送一句话给正在学习的你:“代码不是用来写完美的,是用来不断打磨的。”共勉!
希望这篇结合真实项目经验的入门教程能为你打开 Django 的大门。如果对你有所帮助,欢迎点赞留言,或者跟我交流更多技术话题 😊

评论 0