系列:Python Web 框架
Django 是一个 Python 全栈 Web 框架,遵循 MVT(Model-View-Template)架构,内置 ORM、后台管理、用户认证、表单处理等功能。它的设计理念是「开箱即用」——不需要额外集成就能快速搭建完整的 Web 应用。
适用环境
Django 需要 Python 3.10 及以上版本(Django 5.2.x)。本文在 Linux 环境下示范,macOS 和 Windows 同样适用。
安装前确认 Python 和 pip 版本:
python3 --versionpip --version建议在虚拟环境中操作:
安装 Django
创建项目目录并初始化虚拟环境:
mkdir django-demo && cd django-demopython3 -m venv .venvsource .venv/bin/activate激活后终端提示符前会出现 (.venv) 标识。安装 Django:
pip install django安装完成后确认版本:
python -m django --version创建项目
使用 django-admin 创建一个新项目:
django-admin startproject mysite .注意末尾的 . 表示在当前目录创建项目,这样项目文件会直接放在 django-demo/ 下,不会多套一层目录。
创建后的目录结构:
django-demo/├── manage.py # 命令行工具├── mysite/│ ├── __init__.py│ ├── settings.py # 项目配置│ ├── urls.py # 根路由│ ├── wsgi.py # WSGI 入口│ └── asgi.py # ASGI 入口启动开发服务器:
python manage.py runserver访问 http://127.0.0.1:8000,看到 Django 欢迎页就说明项目创建成功。
默认监听 127.0.0.1:8000,如需局域网访问可以指定地址和端口:
python manage.py runserver 0.0.0.0:8080创建应用
Django 项目由多个「应用」组成,每个应用负责一块独立功能。创建一个名为 blog 的应用:
python manage.py startapp blog目录结构变为:
django-demo/├── manage.py├── mysite/│ └── ...├── blog/│ ├── migrations/ # 数据库迁移文件│ ├── admin.py # 后台管理配置│ ├── apps.py # 应用配置│ ├── models.py # 数据模型│ └── views.py # 视图逻辑把应用注册到项目。编辑 mysite/settings.py,在 INSTALLED_APPS 中添加:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', # 新增]第一个视图
编辑 blog/views.py:
from django.http import HttpResponse
def index(request): return HttpResponse("Hello, Django!")创建 blog/urls.py 配置应用路由:
from django.urls import pathfrom . import views
urlpatterns = [ path('', views.index, name='index'),]然后在项目根路由 mysite/urls.py 中引入:
from django.contrib import adminfrom django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')),]访问 http://127.0.0.1:8000,页面显示 Hello, Django!。
数据模型与 ORM
在 blog/models.py 中定义文章模型:
from django.db import models
class Post(models.Model): title = models.CharField(max_length=200, verbose_name='标题') body = models.TextField(verbose_name='正文') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta: ordering = ['-created_at']
def __str__(self): return self.title生成迁移文件并应用到数据库:
python manage.py makemigrationspython manage.py migrateDjango 默认使用 SQLite,数据库文件为项目根目录下的 db.sqlite3,无需额外配置。
在视图中使用 ORM
修改 blog/views.py:
from django.http import HttpResponsefrom .models import Post
def index(request): posts = Post.objects.all() lines = [f'<li>{p.title} — {p.created_at:%Y-%m-%d}</li>' for p in posts] return HttpResponse(f"<ul>{''.join(lines)}</ul>")通过 shell 添加测试数据
python manage.py shell进入交互式环境:
from blog.models import PostPost.objects.create(title='第一篇文章', body='这是正文内容。')Post.objects.create(title='第二篇文章', body='又一篇正文。')Post.objects.all()刷新页面即可看到文章列表。
使用模板
上面的视图直接把 HTML 写在 Python 代码里,实际项目应当使用模板。在 blog/ 下创建模板目录:
mkdir -p blog/templates/blog创建 blog/templates/blog/index.html:
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>博客</title></head><body> <h1>文章列表</h1> <ul> {% for post in posts %} <li> <h2>{{ post.title }}</h2> <p>{{ post.body|truncatechars:100 }}</p> <small>{{ post.created_at|date:"Y-m-d" }}</small> </li> {% empty %} <li>暂无文章。</li> {% endfor %} </ul></body></html>修改 blog/views.py 使用模板渲染:
from django.shortcuts import renderfrom .models import Post
def index(request): posts = Post.objects.all() return render(request, 'blog/index.html', {'posts': posts})render 接收三个参数:请求对象、模板路径、上下文数据。模板中 {% for %} 和 {{ }} 是 Django 模板语法的循环和变量输出。
后台管理
Django 自带功能完善的后台管理界面。先创建管理员账号:
python manage.py createsuperuser按提示输入用户名、邮箱和密码。把 Post 模型注册到后台,编辑 blog/admin.py:
from django.contrib import adminfrom .models import Post
@admin.register(Post)class PostAdmin(admin.ModelAdmin): list_display = ['title', 'created_at', 'updated_at'] search_fields = ['title']启动服务器后访问 http://127.0.0.1:8000/admin/,用刚才创建的账号登录,即可在后台增删改查文章。
常用命令速查
python manage.py runserver # 启动开发服务器python manage.py startapp appname # 创建应用python manage.py makemigrations # 生成迁移文件python manage.py migrate # 应用迁移python manage.py createsuperuser # 创建管理员python manage.py shell # 交互式 Python shellpython manage.py collectstatic # 收集静态文件python manage.py test # 运行测试python manage.py showmigrations # 查看迁移状态常见问题
修改模型后页面报错
修改了 models.py 后需要生成并应用迁移:
python manage.py makemigrationspython manage.py migrate如果迁移冲突或出错,可以先查看状态:
python manage.py showmigrations静态文件 404
开发环境下 Django 会自动处理静态文件。如果 404,确认 settings.py 中 INSTALLED_APPS 包含了 django.contrib.staticfiles。
生产环境需要用 collectstatic 收集静态文件并由 Nginx 等服务处理。
模板找不到
Django 默认在每个已注册应用的 templates/ 目录下查找模板。推荐的目录结构是 blog/templates/blog/index.html(加一层应用名的子目录),这样不同应用的模板不会重名冲突。
CSRF 验证失败
POST 表单需要在模板内添加 {% csrf_token %} 标签:
<form method="post"> {% csrf_token %} <!-- 表单字段 --> <button type="submit">提交</button></form>如果是在 API 场景(前后端分离),可以给视图加 @csrf_exempt 装饰器,或使用 DRF(Django REST Framework)等方案。
端口已被占用
开发服务器默认使用 8000 端口,如果冲突可以指定其他端口:
python manage.py runserver 8001pip 安装慢或失败
参考 pip 源的设置和使用 配置国内镜像源。
总结
Django 作为全栈框架,优势在于开箱即用和组件齐全。本文覆盖了安装、项目与应用创建、路由配置、ORM 数据操作、模板渲染和后台管理等核心环节,足够搭建一个功能完整的 Web 应用。更多内容可以参考 Django 官方文档。