1. Django项目初始化与环境配置
作为Python生态中最负盛名的全栈式Web框架,Django以其"开箱即用"的特性深受开发者喜爱。但在实际项目启动时,合理的环境配置往往决定了后续开发效率。让我们从零开始搭建一个标准的Django开发环境。
1.1 Python环境准备
Django 4.2+要求Python 3.8及以上版本。推荐使用pyenv管理多版本Python环境:
bash复制# 安装pyenv(Mac/Linux)
curl https://pyenv.run | bash
# 安装指定Python版本
pyenv install 3.10.6
# 创建项目专用环境
pyenv virtualenv 3.10.6 mydjango
cd project_dir
pyenv local mydjango
注意:Windows用户可使用pyenv-win替代,或直接安装官方Python发行版
验证环境:
bash复制python -m pip install --upgrade pip
pip list # 应只显示pip和setuptools两个包
1.2 Django安装与版本选择
当前稳定版(LTS)是Django 4.2,但新项目建议直接安装最新版:
bash复制pip install django
若需指定版本:
bash复制pip install django==4.2.5
验证安装:
bash复制python -m django --version
1.3 项目骨架生成
使用Django admin命令创建项目骨架:
bash复制django-admin startproject myproject
cd myproject
关键目录结构说明:
code复制myproject/
├── manage.py # 项目管理脚本
└── myproject/
├── __init__.py
├── settings.py # 核心配置文件
├── urls.py # 主路由配置
└── wsgi.py # WSGI入口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深度配置settings.py
2.1 基础配置项调优
打开myproject/settings.py,这些关键配置需要立即调整:
python复制# 安全配置
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY') # 从环境变量读取
DEBUG = False # 生产环境必须关闭
# 国际化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_TZ = True
# 静态文件
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
2.2 数据库连接配置
以MySQL为例(需先安装mysqlclient包):
python复制DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'dbuser',
'PASSWORD': 'dbpassword',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
}
提示:开发环境可用SQLite,但生产环境务必使用PostgreSQL/MySQL等专业数据库
2.3 中间件与APP配置
默认MIDDLEWARE已包含常用组件,建议添加:
python复制INSTALLED_APPS = [
...
'django.contrib.humanize', # 人性化过滤器
'django_extensions', # 扩展工具集
'debug_toolbar', # 调试工具栏
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # 静态文件优化
...
]
3. 应用(APP)开发实战
3.1 创建第一个APP
bash复制python manage.py startapp blog
注册APP到settings.py:
python复制INSTALLED_APPS = [
...
'blog.apps.BlogConfig',
]
3.2 模型设计示例
编辑blog/models.py:
python复制from django.db import models
from django.urls import reverse
class Post(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
]
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.month,
self.publish.day,
self.slug])
生成迁移文件并应用:
bash复制python manage.py makemigrations
python manage.py migrate
3.3 视图与URL配置
blog/views.py基础视图:
python复制from django.views.generic import ListView, DetailView
from .models import Post
class PostListView(ListView):
queryset = Post.published.all()
context_object_name = 'posts'
paginate_by = 5
template_name = 'blog/post/list.html'
class PostDetailView(DetailView):
model = Post
template_name = 'blog/post/detail.html'
配置URL路由(blog/urls.py):
python复制from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.PostListView.as_view(), name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/',
views.PostDetailView.as_view(), name='post_detail'),
]
在主urls.py中包含APP路由:
python复制from django.urls import include, path
urlpatterns = [
path('blog/', include('blog.urls', namespace='blog')),
...
]
4. 高级配置与优化技巧
4.1 多环境配置管理
使用python-decouple管理不同环境配置:
- 安装包:
bash复制pip install python-decouple
- 创建.env文件:
code复制DEBUG=True
SECRET_KEY=your-secret-key-here
DB_URL=mysql://user:password@localhost/dbname
- 修改settings.py:
python复制from decouple import config
DEBUG = config('DEBUG', default=False, cast=bool)
SECRET_KEY = config('SECRET_KEY')
DATABASES = {
'default': dj_database_url.config(
default=config('DB_URL')
)
}
4.2 缓存配置示例
使用Redis作为缓存后端:
- 安装依赖:
bash复制pip install redis django-redis
- settings.py配置:
python复制CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
},
"KEY_PREFIX": "myproject"
}
}
# 会话引擎配置
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
4.3 静态文件处理
生产环境静态文件收集与压缩:
bash复制pip install whitenoise
settings.py配置:
python复制MIDDLEWARE = [
# ...
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
收集静态文件:
bash复制python manage.py collectstatic
4.4 日志配置模板
生产环境日志配置示例:
python复制LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{',
},
},
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': '/var/log/django/debug.log',
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
}
}
5. 开发工作流优化
5.1 自动化测试配置
创建tests目录结构:
code复制blog/
└── tests/
├── __init__.py
├── test_models.py
├── test_views.py
└── test_forms.py
示例测试用例(test_models.py):
python复制from django.test import TestCase
from django.utils import timezone
from .models import Post
class PostModelTest(TestCase):
@classmethod
def setUpTestData(cls):
Post.objects.create(
title='Test title',
body='Test content',
status='published'
)
def test_title_content(self):
post = Post.objects.get(id=1)
self.assertEqual(post.title, 'Test title')
运行测试:
bash复制python manage.py test blog.tests
5.2 开发服务器增强
使用django-extensions的runserver_plus:
bash复制pip install django-extensions werkzeug
启动开发服务器:
bash复制python manage.py runserver_plus --cert-file cert.crt
功能亮点:自动SSL、更好的错误页面、SQL查询分析
5.3 数据库可视化工具
安装django-adminlte2:
bash复制pip install django-adminlte2
settings.py配置:
python复制INSTALLED_APPS += ('adminlte2_pdq',)
该工具提供:
- 数据库内容可视化编辑
- SQL查询界面
- 数据导出/导入功能
6. 生产部署准备
6.1 WSGI配置优化
创建myproject/wsgi_prod.py:
python复制import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.prod')
application = get_wsgi_application()
6.2 安全加固清单
必须完成的安全生产前检查:
- 确保DEBUG=False
- 设置ALLOWED_HOSTS
- 配置CSRF_TRUSTED_ORIGINS
- 禁用admin的默认路径
- 设置SECURE_HSTS_SECONDS
- 配置HTTPS重定向
示例配置:
python复制# settings/prod.py
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000 # 1 year
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
6.3 性能优化配置
数据库连接池配置:
python复制DATABASES['default']['OPTIONS'] = {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'pool_size': 20,
'max_overflow': 30,
'pool_timeout': 30,
'pool_recycle': 3600,
}
模板缓存配置:
python复制TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
],
'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]),
],
},
},
]
7. 常见问题解决方案
7.1 模块导入错误排查
当出现"No module named 'xxx'"错误时:
-
检查是否已安装对应包
bash复制
pip list | grep xxx -
确认Python解释器路径
python复制import sys print(sys.path) -
检查项目目录是否在PYTHONPATH中
7.2 数据库迁移问题处理
迁移失败时的标准处理流程:
-
查看具体错误
bash复制
python manage.py migrate --verbosity 3 -
若需重置迁移:
bash复制find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete python manage.py makemigrations -
伪造迁移(慎用):
bash复制
python manage.py migrate --fake
7.3 静态文件404问题
排查步骤:
- 检查STATIC_URL和STATIC_ROOT配置
- 确认collectstatic已执行
- 开发环境需配置:
python复制if DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) - 生产环境检查Web服务器(Nginx/Apache)配置
7.4 时区问题处理
确保配置一致性:
- 数据库服务器时区
- Django的TIME_ZONE设置
- 操作系统的时区设置
检查命令:
bash复制# 数据库时区(MySQL示例)
mysql> SELECT @@global.time_zone, @@session.time_zone;
# Python时区
python -c "import time; print(time.tzname)"
8. 扩展生态系统
8.1 常用第三方包推荐
-
开发工具类:
- django-debug-toolbar:调试面板
- django-extensions:开发工具集
- ipdb:增强调试器
-
API开发:
- djangorestframework:REST API框架
- drf-yasg:API文档生成
-
安全增强:
- django-cors-headers:CORS支持
- django-axes:登录保护
-
性能优化:
- django-compressor:静态文件压缩
- django-cachalot:自动缓存
8.2 异步任务处理
Celery集成配置:
- 安装依赖:
bash复制pip install celery redis
- 创建celery.py:
python复制import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
- settings.py配置:
python复制CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_TIMEZONE = 'Asia/Shanghai'
8.3 现代前端集成
Vue.js与Django集成方案:
- 创建前端目录:
bash复制mkdir frontend
cd frontend
npm init vue@latest
-
配置webpack/vite输出到Django静态目录
-
添加Django模板标签:
html复制{% load static %}
<script src="{% static 'frontend/assets/index.js' %}"></script>
- 开发时配置代理:
javascript复制// vite.config.js
server: {
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true
}
}
}
9. 项目结构优化建议
9.1 模块化settings配置
推荐的项目结构:
code复制myproject/
├── config/
│ ├── __init__.py
│ ├── settings/
│ │ ├── base.py
│ │ ├── dev.py
│ │ └── prod.py
│ └── urls.py
├── apps/
│ └── blog/
└── manage.py
拆分settings逻辑:
- base.py:通用配置
- dev.py:开发环境覆盖配置
- prod.py:生产环境特殊配置
9.2 自定义管理命令
创建实用命令示例:
- 创建命令目录:
bash复制mkdir -p blog/management/commands
touch blog/management/{__init__,commands/__init__}.py
- 编写命令(commands/export_posts.py):
python复制from django.core.management.base import BaseCommand
from blog.models import Post
class Command(BaseCommand):
help = 'Export published posts to JSON'
def handle(self, *args, **options):
import json
from django.core.serializers import serialize
posts = Post.objects.filter(status='published')
data = serialize('json', posts)
with open('posts_export.json', 'w') as f:
json.dump(data, f)
self.stdout.write(self.style.SUCCESS('Successfully exported posts'))
使用命令:
bash复制python manage.py export_posts
9.3 自动化部署配置
使用Fabric实现一键部署:
- 安装Fabric:
bash复制pip install fabric
- 创建fabfile.py:
python复制from fabric import task
@task
def deploy(c):
# 更新代码
c.run('git pull origin main')
# 安装依赖
c.run('pip install -r requirements.txt')
# 迁移数据库
c.run('python manage.py migrate --noinput')
# 收集静态文件
c.run('python manage.py collectstatic --noinput')
# 重启服务
c.run('sudo systemctl restart gunicorn')
c.run('sudo systemctl restart nginx')
执行部署:
bash复制fab -H user@server deploy
10. 监控与维护
10.1 健康检查配置
添加django-health-check:
- 安装配置:
bash复制pip install django-health-check
settings.py配置:
python复制INSTALLED_APPS += (
'health_check',
'health_check.db',
'health_check.cache',
'health_check.storage',
)
urlpatterns += [
path('health/', include('health_check.urls')),
]
10.2 性能监控
使用django-silk进行性能分析:
- 安装配置:
bash复制pip install django-silk
settings.py配置:
python复制MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
INSTALLED_APPS += (
'silk',
)
SILKY_PYTHON_PROFILER = True
SILKY_META = True
10.3 错误追踪
Sentry集成步骤:
- 安装SDK:
bash复制pip install sentry-sdk
- settings.py配置:
python复制import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_sdk.init(
dsn="your-dsn-here",
integrations=[DjangoIntegration()],
traces_sample_rate=1.0,
send_default_pii=True
)
11. 持续集成实践
11.1 GitHub Actions配置
创建.github/workflows/django.yml:
yaml复制name: Django CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
env:
DATABASE_URL: postgres://postgres:postgres@localhost:5432/postgres
DJANGO_SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
run: |
python manage.py test
11.2 测试覆盖率集成
使用pytest-cov生成覆盖率报告:
- 安装依赖:
bash复制pip install pytest pytest-cov pytest-django
- 创建pytest.ini:
ini复制[pytest]
DJANGO_SETTINGS_MODULE = myproject.settings
python_files = tests.py test_*.py *_tests.py
addopts = --cov=blog --cov-report=html
- 运行测试:
bash复制pytest
12. 项目文档自动化
12.1 MkDocs集成
创建专业项目文档:
- 安装配置:
bash复制pip install mkdocs mkdocs-material
mkdocs new docs
- 配置mkdocs.yml:
yaml复制site_name: MyProject Docs
theme:
name: material
features:
- navigation.tabs
- navigation.indexes
nav:
- Home: index.md
- API Reference:
- Models: api/models.md
- Views: api/views.md
- 生成文档:
bash复制mkdocs build
12.2 API文档生成
使用drf-spectacular生成OpenAPI文档:
- 安装配置:
bash复制pip install drf-spectacular
- settings.py配置:
python复制INSTALLED_APPS += ('drf_spectacular',)
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}
SPECTACULAR_SETTINGS = {
'TITLE': 'MyProject API',
'DESCRIPTION': 'Detailed API documentation',
'VERSION': '1.0.0',
}
- 配置URL:
python复制from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView
urlpatterns += [
path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
]
