从零到一:用 Django 搭建我的第一个 Python 网站
开篇:为什么是 Django?

作为一名后端开发者,我接触过不少 Web 框架。Node.js、Flask、Ruby on Rails 都用过,但当我真正想快速搭建一个功能齐全的网站时,还是 Django 给了我最大的信心。
Django 是一个基于 Python 的高级 Web 框架,它以“开箱即用”的理念著称,提供了很多内置功能,比如 ORM(对象关系映射)、管理后台、用户认证系统等。如果你像我一样既想要开发效率,又不想在底层反复造轮子,那么 Django 是个非常不错的选择。
这篇文章会结合我第一次使用 Django 搭建个人博客的经历,带你从零开始一步步构建自己的第一个网站,并分享我在过程中踩过的坑和收获的心得。
背景与项目需求

去年年底,我想搭建一个自己的技术博客站点,用来记录学习笔记和项目经验。之前一直在用静态博客平台(如 Jekyll),但我希望这次能实现一些动态交互的功能,比如:
- 用户评论功能
- 后台文章管理界面
- 数据统计模块(阅读量、点赞数)
- 可扩展性:后续接入 RESTful API 和移动端 App
考虑到开发周期和可维护性,我最终决定选择 Django 来完成这个项目。
第一步:环境搭建

安装 Python 和 Virtualenv
我使用的 Python 版本是 3.10(建议至少使用 3.8+)。Django 对 Python 的版本有要求,选对版本可以避免很多兼容问题。
为了隔离项目的依赖环境,我用的是 virtualenv:
python -m venv venv
source venv/bin/activate
激活虚拟环境后,安装 Django:
pip install django
安装完成后执行:
django-admin --version
确认是否输出了正确的版本号(我当时用的是 4.1.x)。
初始化项目结构

接下来创建项目:
django-admin startproject myblog
cd myblog
项目目录如下:
myblog/
├── manage.py
└── myblog/
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
这时你可以先启动服务器看看效果:
python manage.py runserver
浏览器访问 http://127.0.0.1:8000,出现 Django 的欢迎页面就说明环境没问题了。
创建应用并设计数据模型
Django 项目由多个“app”组成,每个 app 负责一个具体的功能。我这里先创建一个 blog 应用:
python manage.py startapp blog
然后别忘了把这个 app 添加进 settings.py 的 INSTALLED_APPS 中:
INSTALLED_APPS = [
...
'blog',
]
数据模型设计
博客的核心就是文章,所以我定义了一个 Article 模型:
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
class Article(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)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
这里有几个关键点需要注意:
- 使用
ForeignKey关联了内置的User模型,方便后期做权限控制。 - 自动添加了时间戳字段,这样不用手动维护创建和更新时间。
__str__方法用于在管理后台显示更友好的名称。
然后执行数据库迁移:
python manage.py makemigrations
python manage.py migrate
此时数据库表已经生成完毕。
管理后台配置
Django 内置了一个非常强大的管理后台,我只需要简单配置就可以使用。
编辑 blog/admin.py:
from django.contrib import admin
from .models import Article
admin.site.register(Article)
接着创建超级用户:
python manage.py createsuperuser
输入用户名、邮箱、密码后,在 http://localhost:8000/admin 登录,就能看到我们注册的 Article 表,可以直接通过界面上新增内容。
这是我第一次体验 Django 的管理后台,真的太方便了,省去了自己写 CRUD 接口的时间!
页面展示逻辑
接下来要实现文章列表页和详情页。这需要编写视图函数和模板文件。
编写视图
在 blog/views.py 中添加:
from django.shortcuts import render, get_object_or_404
from .models import Article
def article_list(request):
articles = Article.objects.all().order_by('-created_at')
return render(request, 'blog/article_list.html', {'articles': articles})
def article_detail(request, pk):
article = get_object_or_404(Article, pk=pk)
return render(request, 'blog/article_detail.html', {'article': article})
这两个函数分别用于展示文章列表和详情页。注意这里用了 get_object_or_404,如果找不到对应的文章,就会返回 404 页面,而不是异常堆栈,这对用户体验很好。
模板渲染
创建 templates/blog/article_list.html 文件:
<h1>My Blog</h1>
<ul>
{% for article in articles %}
<li><a href="{% url 'article_detail' article.id %}">{{ article.title }}</a></li>
{% endfor %}
</ul>
以及 article_detail.html:
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p><small>Published at {{ article.created_at }}</small></p>
记得在项目设置中配置模板路径:
在 myblog/settings.py 中找到 TEMPLATES,把模板目录加入进去:
TEMPLATES = [
{
...
'DIRS': [BASE_DIR / 'templates'],
...
}
]
URL 配置
最后在 blog/urls.py 中定义路由:
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
path('article/<int:pk>/', views.article_detail, name='article_detail'),
]
然后在项目的主 urls.py 中引入:
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
运行服务再次访问首页 http://localhost:8000,你就能看到文章列表了。
遇到的挑战和解决过程
🛠️ 模板加载失败
在刚开始的时候,我犯了个低级错误——忘记在 settings.py 中配置模板路径,结果一直提示 TemplateDoesNotExist。
教训:
确保你在 TEMPLATES['DIRS'] 中正确设置了模板目录,并且文件结构和引用路径一一对应。
🔒 权限控制没有做好
初期我忽略了权限控制的问题,所有人都可以访问任何文章详情页,包括删除、修改操作。后来才意识到,必须加一层用户认证。
解决办法是在视图中加上:
from django.contrib.auth.decorators import login_required
@login_required
def article_detail(request, pk):
...
并在前端判断用户是否登录:
{% if user.is_authenticated %}
<a href="#">发布新文章</a>
{% else %}
请 <a href="#">登录</a> 后评论
{% endif %}
Django 的用户系统真的很强大,基本不需要自己写登录逻辑。
🧪 测试用例缺失导致上线出错
一开始我没写单元测试,结果部署到生产环境后发现某个查询语句写了错的字段名,程序直接崩溃。后来我加上了简单的测试:
# blog/tests.py
from django.test import TestCase
from .models import Article
from django.utils import timezone
class ArticleModelTest(TestCase):
def test_article_creation(self):
article = Article(title="Test", content="Test", author_id=1)
article.save()
self.assertEqual(article.title, "Test")
测试虽然简单,但能提前发现很多潜在问题。
性能优化和部署经验
💾 数据库索引优化
随着文章数量增加,我发现文章列表的查询速度变慢。于是开始检查数据库性能,在 Django ORM 层面对 created_at 字段增加了索引:
created_at = models.DateTimeField(auto_now_add=True, db_index=True)
同时避免在视图中频繁使用 select_related 或 prefetch_related 以外的嵌套查询,减少 N+1 查询问题。
📦 静态资源处理
网站上线后静态资源无法加载?那是因为开发环境下 Django 默认不会处理静态文件。你需要运行:
python manage.py collectstatic
然后在 nginx 或其他 Web 服务器配置中指向静态资源目录:
location /static/ {
alias /path/to/static_root/;
}
别忘了把 STATIC_ROOT = BASE_DIR / 'static_root' 设置好。
🚀 生产环境部署
我使用的是 Gunicorn + Nginx 的组合,部署流程大致如下:
- 将代码上传到服务器
- 安装依赖:
pip install -r requirements.txt - 执行迁移:
python manage.py migrate - 收集静态文件:
python manage.py collectstatic - 配置 gunicorn 服务(建议配合 systemd 管理)
- 配置 nginx 作为反向代理
另外,推荐将数据库换成 PostgreSQL,它更适合中大型项目,比 SQLite 更稳定。
结果与收益总结
经过两周的开发,我的博客站点顺利上线,不仅满足了最初的动态功能需求,还为后续拓展打下了良好的基础。现在支持:
- 用户登录与权限控制
- 文章增删改查
- 后台管理界面
- 基础性能优化和部署能力
最让我满意的一点是,整个项目只用了不到 1k 行代码,却完成了完整的基础功能,这就是 Django 的魅力所在。
我的经验建议
作为一位实际经历过从零开发到部署上线的开发者,我想给刚入门的朋友几个建议:
- 别一开始就想着完美设计架构,先把功能跑起来更重要。Django 很适合迭代式开发。
- 合理利用管理后台,它可以帮你省下大量 CRUD 时间。
- 重视测试环节,哪怕只是小项目,也能大幅减少 Bug。
- 性能优化不必过早介入,但一定要在项目中期考虑扩展性和数据库瓶颈。
- 多看官方文档和社区项目,比如 Django Girls,它们提供了丰富的实战例子。

结语

Django 是一个值得每一位 Python 开发者深入掌握的框架。它不仅能提升你的开发效率,还能让你写出结构清晰、易于维护的代码。无论是做内部工具、小型产品原型,还是中大型系统的后端部分,Django 都能胜任。
希望这篇文章能帮到正在学习或即将尝试 Django 的你。如果你也有自己的 Django 故事,欢迎留言交流~

评论 0