1. Django框架概述:为什么选择它?
Django是一个基于Python的高级Web框架,它遵循"不重复造轮子"(Don't Repeat Yourself)的理念,为开发者提供了一套完整的工具链。我第一次接触Django是在2013年,当时正在为一个电商项目评估技术栈,最终选择Django的原因很简单——它自带的管理后台让我在项目初期就节省了至少200小时的开发时间。
Django的核心优势在于其"全栈式"设计。不同于Flask等微框架需要自行组装各个组件,Django开箱即提供:
- ORM(对象关系映射)
- 模板引擎
- 路由系统
- 用户认证
- 管理后台
- 表单处理
- 安全防护
这种"全家桶"式的设计特别适合中小型项目快速启动。以我最近开发的在线教育平台为例,从零开始到第一个可演示版本仅用了72小时,其中用户权限系统直接使用了Django内置的auth模块,课程管理功能则基于admin后台二次开发。
提示:虽然Django适合快速开发,但在超大型项目中可能需要剥离部分内置功能。我在处理一个日PV超过500万的新闻站点时,就不得不替换掉默认的模板引擎和ORM。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境配置实战
2.1 Python环境准备
Django需要Python 3.6及以上版本。我强烈建议使用pyenv管理多版本Python环境,特别是在同时维护多个项目时。以下是Ubuntu系统下的配置步骤:
bash复制# 安装依赖
sudo apt-get update
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev
# 安装pyenv
curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
# 安装指定Python版本
pyenv install 3.9.6
pyenv global 3.9.6
2.2 虚拟环境配置
永远不要在系统Python中直接安装项目依赖!这是我用血泪教训换来的经验。使用venv创建隔离环境:
bash复制python -m venv myenv
source myenv/bin/activate # Linux/Mac
# myenv\Scripts\activate # Windows
虚拟环境激活后,提示符前会出现环境名称标记。建议将虚拟环境目录添加到.gitignore中。
2.3 Django安装与验证
安装最新稳定版Django:
bash复制pip install django
验证安装是否成功:
python复制python -m django --version
# 应该输出类似 4.2.3 的版本号
注意:如果同时开发多个Django项目,建议使用pip-tools管理依赖。我常用的工作流是:
- 在requirements.in中写明基础依赖
- 运行
pip-compile requirements.in生成精确版本锁文件- 使用
pip-sync同步环境
3. 项目创建与结构解析
3.1 创建第一个项目
执行以下命令创建名为mysite的项目:
bash复制django-admin startproject mysite
这会生成如下目录结构:
code复制mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
让我解释几个关键文件:
manage.py:项目管理入口,相当于项目的瑞士军刀settings.py:所有配置的核心,相当于项目的大脑urls.py:URL路由配置,相当于项目的交通指挥中心
3.2 开发服务器启动
进入项目目录并运行开发服务器:
bash复制cd mysite
python manage.py runserver
访问 http://127.0.0.1:8000 应该看到火箭发射的欢迎页面。这个开发服务器自带自动重载功能,但在生产环境绝对不要使用它!
3.3 项目结构最佳实践
经过十几个Django项目后,我总结出更合理的项目结构:
code复制project/
config/ # 原mysite目录重命名
settings/
__init__.py
base.py # 通用配置
dev.py # 开发环境配置
prod.py # 生产环境配置
urls.py
wsgi.py
apps/ # 所有应用放在这里
core/ # 核心功能应用
accounts/ # 用户管理应用
...
static/ # 静态文件
templates/ # 全局模板
manage.py
requirements.txt
这种结构通过拆分settings文件实现环境隔离,使用python-dotenv管理敏感信息:
python复制# config/settings/base.py
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
INSTALLED_APPS = [
'django.contrib.admin',
...
]
# config/settings/dev.py
from .base import *
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
4. 核心配置详解
4.1 数据库配置
Django默认使用SQLite,但实际项目中我更推荐PostgreSQL。以下是两种配置对比:
python复制# SQLite配置(开发用)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# PostgreSQL配置(生产用)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
重要经验:永远不要在版本控制中提交数据库密码!使用环境变量管理:
python复制import os
DATABASES['default']['PASSWORD'] = os.getenv('DB_PASSWORD')
4.2 静态文件配置
静态文件(CSS, JavaScript, 图片)的配置是新手常踩的坑。正确配置如下:
python复制# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles' # collectstatic收集目录
STATICFILES_DIRS = [BASE_DIR / 'static'] # 开发时静态文件目录
# urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
... # 你的URL配置
]
if settings.DEBUG:
urlpatterns += static(
settings.STATIC_URL,
document_root=settings.STATIC_ROOT
)
4.3 模板配置
现代Django项目推荐使用如下模板配置:
python复制TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR / 'templates',
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
4.4 国际化配置
即使项目暂时不需要多语言支持,也应该提前配置:
python复制LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
5. 应用创建与模型设计
5.1 创建第一个应用
执行以下命令创建blog应用:
bash复制python manage.py startapp blog
然后手动创建templates目录:
code复制blog/
migrations/
templates/
blog/ # 应用专属模板
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
别忘了在settings.py中注册应用:
python复制INSTALLED_APPS = [
...
'blog.apps.BlogConfig',
]
5.2 模型设计示例
让我们创建一个简单的博客模型:
python复制from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='blog_posts'
)
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(
max_length=10,
choices=STATUS_CHOICES,
default='draft'
)
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
5.3 数据库迁移
创建并应用迁移:
bash复制python manage.py makemigrations
python manage.py migrate
调试技巧:使用
python manage.py sqlmigrate blog 0001查看生成的SQL语句,这对理解Django ORM非常有帮助。
6. 管理后台配置
Django admin是框架的杀手级功能。配置步骤如下:
6.1 创建超级用户
bash复制python manage.py createsuperuser
按提示输入用户名、邮箱和密码。
6.2 注册模型到admin
修改blog/admin.py:
python复制from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'author', 'publish', 'status')
list_filter = ('status', 'created', 'publish', 'author')
search_fields = ('title', 'body')
prepopulated_fields = {'slug': ('title',)}
raw_id_fields = ('author',)
date_hierarchy = 'publish'
ordering = ('status', 'publish')
现在访问/admin就能看到功能完善的内容管理系统了。我曾在客户演示中仅用admin后台就完成了80%的原型演示,这为项目赢得了宝贵的前期信任。
7. 视图与URL配置
7.1 基础视图示例
在blog/views.py中添加:
python复制from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.published.all()
return render(request,
'blog/post/list.html',
{'posts': posts})
def post_detail(request, year, month, day, post):
post = get_object_or_404(
Post,
slug=post,
publish__year=year,
publish__month=month,
publish__day=day
)
return render(request,
'blog/post/detail.html',
{'post': post})
7.2 URL配置
项目级URL配置(config/urls.py):
python复制from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
应用级URL配置(blog/urls.py):
python复制from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.post_list, name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/',
views.post_detail,
name='post_detail'),
]
这种两级URL配置方式让项目结构更清晰。我在处理一个包含30多个应用的电商平台时,这种结构大大降低了维护难度。
8. 模板系统实战
8.1 基础模板架构
创建templates/base.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
<link href="{% static 'css/blog.css' %}" rel="stylesheet">
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="sidebar">
<h2>My blog</h2>
<p>This is my blog.</p>
</div>
</body>
</html>
8.2 继承模板示例
创建templates/blog/post/list.html:
html复制{% extends "base.html" %}
{% block title %}My Blog{% endblock %}
{% block content %}
<h1>My Blog</h1>
{% for post in posts %}
<h2>
<a href="{{ post.get_absolute_url }}">
{{ post.title }}
</a>
</h2>
<p class="date">
Published {{ post.publish }} by {{ post.author }}
</p>
{{ post.body|truncatewords:30|linebreaks }}
{% endfor %}
{% endblock %}
8.3 模板标签技巧
Django模板系统非常强大,我最常使用的几个高级特性:
- 自定义模板标签:
python复制# blog/templatetags/blog_tags.py
from django import template
register = template.Library()
@register.simple_tag
def total_posts():
return Post.published.count()
- 包含模板:
html复制{% load blog_tags %}
...
<p>This is my blog. I've written {% total_posts %} posts so far.</p>
- 模板过滤器链:
html复制{{ post.body|markdown|truncatewords_html:30 }}
9. 生产环境部署准备
9.1 安全配置
永远不要用默认配置直接上线!至少修改以下设置:
python复制# config/settings/prod.py
from .base import *
DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')
# HTTPS设置
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
# 安全头
SECURE_HSTS_SECONDS = 31536000 # 1年
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
9.2 性能优化
- 缓存配置:
python复制CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
- 数据库连接池:
python复制DATABASES['default']['OPTIONS'] = {
'max_connections': 100,
'timeout': 30,
}
- 静态文件收集:
bash复制python manage.py collectstatic
9.3 部署工具选择
根据项目规模,我通常这样选择:
- 小型项目:Nginx + Gunicorn
- 中型项目:Nginx + uWSGI
- 大型项目:Docker + Kubernetes
一个典型的Gunicorn启动命令:
bash复制gunicorn --workers 3 --bind unix:/tmp/gunicorn.sock config.wsgi
10. 常见问题排查
10.1 数据库连接问题
错误现象:django.db.utils.OperationalError: could not connect to server
解决方案:
- 检查数据库服务是否运行
- 验证settings.py中的连接参数
- 测试网络连通性:
bash复制psql -h hostname -U username -d dbname
10.2 静态文件404
错误现象:CSS/JS文件无法加载
解决方案:
- 确保DEBUG=False时运行了collectstatic
- 检查Nginx配置是否正确:
nginx复制location /static/ {
alias /path/to/staticfiles/;
}
10.3 迁移冲突
错误现象:django.db.migrations.exceptions.InconsistentMigrationHistory
解决方案:
- 备份数据库
- 删除有问题的迁移文件
- 重置迁移:
bash复制find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
python manage.py makemigrations
python manage.py migrate --fake
经过15个Django项目的实战,我总结出一个黄金法则:当遇到奇怪的问题时,先执行以下三步:
- 检查虚拟环境是否正确激活
- 运行
python manage.py check - 查看Django的debug日志
这能解决80%的初期问题。记住,Django有着极其完善的错误提示机制,仔细阅读错误信息往往就能找到解决方案。
