Django入门指南:从0到1搭建你的第一个Python网站
开篇:我为什么要写这篇教程?

作为一名后端工程师,我已经使用Django开发了超过五年的项目。还记得刚开始接触Django的时候,我也曾被它强大的功能和简洁的设计吸引,同时也因为它的“约定大于配置”理念,节省了我在项目初期大量的决策成本。
今天我想以一个老开发者、一名曾经的新手的身份,带你从头开始一步步搭建你的第一个Django项目。我会结合一个真实的小型博客系统作为案例,来分享从环境搭建、目录结构规划、数据库设计、接口实现、遇到的坑、生产部署等全过程。
这篇文章不是纯理论的教条式教程,而是一次带着温度的实战经验复盘,希望对你真正上手Django有帮助。
项目背景与挑战:我们为什么要做一个博客系统?

在我刚入职的第一家公司,我接到的第一个任务就是用Python做一个小型企业内部知识库系统——本质上就是一个轻量级博客系统,允许员工发表文章、归类标签、评论互动等功能。
当时公司内部没有现成的技术栈规范,我需要自己选框架。调研一圈之后,我发现Django在社区活跃度、文档完整性和可扩展性方面都有显著优势,而且自带很多开箱即用的功能(比如后台管理、ORM、表单验证、权限管理等等),非常适合做内容管理系统类的产品。
初期遇到的几个关键问题:
- 如何快速搭建一个可用的原型?
- 如何设计合理的模型结构(Model)和URL结构(路由)?
- 新手上手如何组织代码结构,避免后期混乱?
- 怎么避免重复造轮子,利用好Django生态系统?
这些问题看似简单,但对于刚入门的我来说,每一步都像是踩在未知的地雷区里摸索前进。
技术选型与方案设计:为什么选择Django?

首先,我决定使用 Python 3.10 + Django 4.2 + SQLite(本地测试)+ PostgreSQL(生产) 的组合。理由如下:
- Django官方维护质量高,生态强大;
- ORM封装非常友好,适合快速迭代;
- 自带Admin后台,对内容管理极其方便;
- 前后端不分离,适合小项目起步;
- 社区插件丰富,比如
django-taggit用于处理标签,非常实用。
接下来,根据需求设计出核心功能模块:
| 功能模块 | 描述 |
|---|---|
| 文章管理 | 支持创建/编辑/删除文章 |
| 标签系统 | 每篇文章可以打多个标签 |
| 用户系统 | 使用Django默认User系统,并稍作拓展 |
| 分类体系 | 将文章分类为“技术笔记”、“生活随笔”等 |
| 评论功能 | 允许访客对文章进行评论 |
| 首页展示 | 按时间倒序展示最近的文章列表 |
这些模块虽然简单,但已经能覆盖常见的CMS系统功能。而且一旦跑起来,后续加新功能也容易。
第一步:创建Django项目和App

安装依赖和初始化
# 创建虚拟环境并激活
python -m venv venv
source venv/bin/activate # Windows用户用 venv\Scripts\activate
# 安装Django
pip install django==4.2
# 创建项目
django-admin startproject blog_project
cd blog_project
此时会生成如下目录结构:
blog_project/
├── blog_project/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
这是Django项目的主结构。
创建app(应用)
Django推崇“一个功能一个App”的设计理念,所以我为每个核心模块单独建App:
python manage.py startapp articles
python manage.py startapp comments
然后记得把它们添加到settings.py里的INSTALLED_APPS中:
INSTALLED_APPS = [
...
'articles',
'comments',
]
数据模型设计:从数据库开始构建基石
Django最大的优点之一就是它出色的ORM支持。这里我只列出文章的核心Model定义,其余略。
# articles/models.py
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
tags = models.ManyToManyField(Tag, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self):
return self.title
✨ 一点经验:
刚开始的时候很容易把所有东西都塞进一个大model里,后来发现应该尽量拆分逻辑模型,这样不仅更易维护,也能提高数据一致性。
比如这里我把分类(Category)和标签(Tag)单独作为一个model而不是简单的字段,是为了后面灵活管理和查询。
执行迁移:
python manage.py makemigrations
python manage.py migrate
这样就完成了数据库表结构的创建。
路由和视图设计:让网页动起来
Django鼓励使用基于函数或类的视图。我选择使用类视图(Class-Based Views)来提升代码的可读性和重用性。
比如首页展示文章列表,可以这样写:
# articles/views.py
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/home.html'
context_object_name = 'articles'
ordering = ['-created_at']
配置路由:
# blog_project/urls.py
from django.urls import path, include
from articles.views import ArticleListView
urlpatterns = [
path('', ArticleListView.as_view(), name='home'),
path('admin/', admin.site.urls),
]
🧠 一个小小的建议:
虽然Django推荐将url路由放在全局的urls.py里,但在实际项目中,建议每个app自行管理自己的urls.py,再通过include引入到主路由文件,这样更清晰。
比如你可以在每个app下添加自己的urls.py文件,类似这样:
# articles/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.ArticleListView.as_view(), name='article-list'),
path('<int:pk>/', views.ArticleDetailView.as_view(), name='article-detail'),
]
然后在主urls.py中引入:
path('articles/', include('articles.urls')),
模板与静态资源:前后端一体化开发体验
Django原生支持模板引擎(DTL),虽然现在很多人喜欢前后端分离,但我个人认为对于中小型项目,特别是在团队人员较少的情况下,使用模板其实效率更高。
我的前端部分主要是使用简单的HTML+Bootstrap来做页面布局。
项目结构示例:
templates/
└── articles/
├── home.html
└── detail.html
static/
└── css/
└── js/
记得在settings.py中设置模板路径和静态文件路径:
TEMPLATES = [
{
...
'DIRS': [BASE_DIR / "templates"],
},
]
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / "static"]
这样就可以在HTML里引用CSS和JS了。
Admin后台:Django最强大的生产力工具之一
Django自带的admin系统简直是内容管理神器。只需要注册一下Model,就可以拥有完整的CRUD操作界面!
# articles/admin.py
from django.contrib import admin
from .models import Article, Category, Tag
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'author', 'created_at']
search_fields = ['title', 'content']
admin.site.register(Category)
admin.site.register(Tag)
启动开发服务器:
python manage.py runserver
访问 http://127.0.0.1:8000/admin 即可看到自动构建的内容管理后台,完全无需额外开发UI!
踩过的坑和解决思路
坑一:数据库索引缺失导致的性能瓶颈
项目上线初期一切正常,但随着文章数量增加到几千篇后,搜索变得缓慢。我分析发现是Article和Tag之间的多对多关系缺少了合适的索引。
解决方案是在数据库层加上复合索引:
class Meta:
indexes = [
models.Index(fields=['category']),
models.Index(fields=['tags']),
]
也可以直接在数据库级别手动加索引(适用于生产环境)。
坑二:CSRF保护拦截POST请求
在实现评论提交时,遇到了CSRF Token缺失的问题。原来是在自定义表单中遗漏了{% csrf_token %}标签,或者使用AJAX请求时未携带token。
解决办法:
- 在表单中始终包含
{% csrf_token %} - 如果是前后端分离,可以使用DRF(Django REST Framework)+ CSRF exempt
坑三:静态文件部署到线上拿不到的问题
本地测试没问题,但部署到Nginx后找不到CSS。这个问题是因为Django在生产环境下不负责静态文件服务,必须走collectstatic流程集中部署。
解决步骤:
- 配置
STATIC_ROOT指向收集后的目标路径; - 执行
python manage.py collectstatic; - Nginx配置静态资源目录映射。
线上部署:从开发到运维的一站式收尾
技术栈选择:
- Nginx 反向代理
- Gunicorn WSGI服务器
- PostgreSQL 生产数据库
- Gunicorn + Supervisor进程管理
- 使用Let’s Encrypt证书做HTTPS
部署过程不细说了,但有几个重点要提醒:
- 不要用
runserver命令上线!那只是开发用的。 - 设置
.env文件,不要明文暴露密钥。 - 注意
ALLOWED_HOSTS设置,否则可能报错400 Bad Request。 - 合理配置Gunicorn的worker数量,一般参考CPU核数。
效果总结:项目上线后的收益
这个博客系统后来成为公司内部的知识沉淀平台,总共支撑了约8个部门的知识分享,共发布近3000篇文档。平均并发请求控制在50以内,通过合理的缓存策略,响应速度稳定在1秒内。
更重要的是,整个开发过程只用了3周,包括学习Django的时间。这得益于Django提供的大量内置功能,让我们专注于业务本身,而不是基础设施。
我给初学者的建议与心路历程
心得一:别怕慢,先跑起来!
刚开始学Django的时候,我总想一口气看懂全部文档,结果反而越看越迷糊。后来才明白:代码才是最好的教程。只要你能运行起一个hello world级别的程序,剩下的都可以慢慢来。
心得二:结构比功能重要
一开始我就没规划好目录结构和各个App的职责范围,结果中间重构了两次,浪费了不少时间。建议新手一开始就养成良好的组织习惯。
心得三:Django的生态太强了,善用第三方库
比如:
django-debug-toolbar—— 开发调试利器django-crispy-forms—— 表单样式美化django-extensions—— 提供shell_plus等高级命令django-storages—— 集成AWS S3上传资源
这些都能帮你省去不少重复开发工作。
心得四:学会看日志、Debug和查Stack Overflow
Django报错机制很完善,错误信息也很清晰,但前提是你得打开DEBUG模式(当然生产环境要关掉)。另外,善用Django Shell进行模型调试也很关键。
python manage.py shell
结语:成长在路上,Django常相伴
回望过去几年,Django陪伴我完成了一个又一个项目,从早期的博客系统到复杂的CRM、ERP、支付网关等系统。它不仅是我的第一门Web框架,更是我理解软件架构、工程实践的重要跳板。
如果你还在犹豫选什么Python Web框架,不妨试试Django。相信我,它不会让你失望。尤其是当你想快速做出一个产品原型、尝试创业、或者是公司临时接手一个项目的时候,Django真的是一个性价比极高的选择。
愿你在学习Django的过程中,少踩坑、多收获,在代码的世界里走得更快更远。
附录:推荐阅读资料
如果你想跟着这个项目一起动手练一遍,欢迎fork我的GitHub仓库,里面有完整的源码和文档说明。
如果还有疑问,随时欢迎留言或私信,我很乐意为你解答。让我们一起进步!
👨💻 作者:某互联网大厂五年后端工程师
📚 热爱开源技术,专注后端架构、DevOps、Python生态研究
📬 微信公众号【CodeThinker】同步更新技术干货

评论 0