1. Django框架概述Python Web开发的瑞士军刀Django作为Python生态中最负盛名的全栈Web框架自2005年诞生以来就以其开箱即用的特性闻名。这个采用MTV架构模式的框架本质上是一个高效的工具集合包含对象关系映射器ORM用Python类定义数据模型自动生成数据库表结构模板引擎分离业务逻辑与展示层支持模板继承机制表单处理内置CSRF防护、数据验证和清理功能管理后台自动生成的内容管理系统节省80%的CRUD开发时间路由系统URLconf配置将URL模式映射到视图函数认证系统用户、组、权限管理一应俱全实战经验在中小型项目中使用Django Admin可以直接获得生产可用的后台这是其他框架难以比拟的优势。我曾用3天时间基于Admin定制出一个出版社图书管理系统而传统开发至少需要2周。2. 环境搭建与项目初始化2.1 开发环境配置推荐使用Python 3.8版本通过venv创建隔离环境python -m venv django_env source django_env/bin/activate # Linux/Mac django_env\Scripts\activate.bat # Windows pip install django4.22.2 项目脚手架生成执行以下命令创建项目骨架django-admin startproject myproject cd myproject python manage.py startapp myapp关键目录结构解析myproject/ ├── manage.py # 项目管理脚本 ├── myproject/ # 全局配置目录 │ ├── __init__.py │ ├── settings.py # 数据库/中间件/模板等配置 │ ├── urls.py # 主路由配置 │ └── wsgi.py # WSGI入口 └── myapp/ # 应用目录 ├── migrations/ # 数据库迁移文件 ├── admin.py # Admin配置 ├── models.py # 数据模型 ├── views.py # 业务逻辑 └── templates/ # 模板文件2.3 基础配置要点在settings.py中必须关注的配置项INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, myapp, # 新增应用 ] DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } } STATIC_URL /static/ # 静态文件URL前缀 STATICFILES_DIRS [BASE_DIR / static] # 静态文件目录3. 核心组件深度解析3.1 模型层(Model)设计模型定义示例myapp/models.pyfrom django.db import models from django.core.validators import MinLengthValidator class Author(models.Model): name models.CharField(max_length100) email models.EmailField(uniqueTrue) bio models.TextField( validators[MinLengthValidator(10)], help_text至少10个字符的作者简介 ) def __str__(self): return self.name class Book(models.Model): title models.CharField(max_length200) author models.ForeignKey(Author, on_deletemodels.CASCADE) publish_date models.DateField() price models.DecimalField(max_digits6, decimal_places2) stock models.PositiveIntegerField(default0) class Meta: ordering [-publish_date] indexes [ models.Index(fields[title]), ]生成迁移并同步数据库python manage.py makemigrations python manage.py migrate3.2 视图层(View)开发函数视图与类视图对比示例# 函数视图 from django.shortcuts import render, get_object_or_404 from .models import Book def book_list(request): books Book.objects.filter(stock__gt0) return render(request, book/list.html, {books: books}) # 类视图 from django.views.generic import ListView, DetailView class BookListView(ListView): model Book template_name book/list.html context_object_name books paginate_by 10 def get_queryset(self): return Book.objects.filter(stock__gt0) class BookDetailView(DetailView): model Book template_name book/detail.html3.3 模板系统实战模板继承示例templates/base.html!DOCTYPE html html head title{% block title %}默认标题{% endblock %}/title {% block css %}{% endblock %} /head body nav导航栏内容/nav main {% block content %}{% endblock %} /main footer页脚信息/footer {% block js %}{% endblock %} /body /html子模板示例templates/book/list.html{% extends base.html %} {% block title %}图书列表{% endblock %} {% block content %} ul {% for book in books %} li a href{{ book.get_absolute_url }}{{ book.title }}/a - {{ book.author.name }} /li {% empty %} li暂无库存图书/li {% endfor %} /ul {% endblock %}4. Django Admin深度定制4.1 基础配置在myapp/admin.py中注册模型from django.contrib import admin from .models import Author, Book admin.register(Book) class BookAdmin(admin.ModelAdmin): list_display (title, author, price, stock) list_filter (author, publish_date) search_fields (title, author__name) raw_id_fields (author,) date_hierarchy publish_date ordering (-publish_date,) admin.site.register(Author)4.2 高级定制技巧自定义表单验证class BookAdminForm(forms.ModelForm): class Meta: model Book fields __all__ def clean_price(self): price self.cleaned_data[price] if price 0: raise forms.ValidationError(价格不能为负数) return price class BookAdmin(admin.ModelAdmin): form BookAdminForm添加自定义操作def make_available(modeladmin, request, queryset): queryset.update(stock100) make_available.short_description 补货100本 class BookAdmin(admin.ModelAdmin): actions [make_available]5. 实战构建RESTful API5.1 DRF基础配置安装DRF并创建序列化器pip install djangorestframework在settings.py中添加INSTALLED_APPS [rest_framework]创建序列化器myapp/serializers.pyfrom rest_framework import serializers from .models import Book class BookSerializer(serializers.ModelSerializer): author_name serializers.CharField(sourceauthor.name, read_onlyTrue) class Meta: model Book fields [id, title, author, author_name, price, stock]5.2 视图集配置from rest_framework import viewsets from .models import Book from .serializers import BookSerializer class BookViewSet(viewsets.ModelViewSet): queryset Book.objects.all() serializer_class BookSerializer filterset_fields [author, stock] search_fields [title, author__name] ordering_fields [price, publish_date]5.3 路由配置from django.urls import path, include from rest_framework.routers import DefaultRouter from myapp import views router DefaultRouter() router.register(rbooks, views.BookViewSet) urlpatterns [ path(api/, include(router.urls)), path(api-auth/, include(rest_framework.urls)), ]6. 部署上线关键步骤6.1 生产环境配置修改settings.pyDEBUG False ALLOWED_HOSTS [yourdomain.com, localhost] STATIC_ROOT BASE_DIR / staticfiles安装必要依赖pip install gunicorn psycopg2-binary6.2 Nginx配置示例server { listen 80; server_name yourdomain.com; location /static/ { alias /path/to/staticfiles; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }6.3 启动服务使用Gunicorn启动gunicorn --workers 3 --bind 127.0.0.1:8000 myproject.wsgi:application7. 性能优化实战技巧查询优化# 反例N1查询问题 books Book.objects.all() for book in books: print(book.author.name) # 每次循环都查询数据库 # 正例使用select_related books Book.objects.select_related(author).all()缓存策略from django.core.cache import cache def get_books(): books cache.get(all_books) if not books: books list(Book.objects.all()) cache.set(all_books, books, timeout3600) return books异步任务 安装Celerypip install celery redis创建任务myapp/tasks.pyfrom celery import shared_task from django.core.mail import send_mail shared_task def send_notification_email(subject, message, recipient): send_mail( subject, message, adminexample.com, [recipient], fail_silentlyFalse, )8. 安全防护最佳实践CSRF防护form methodpost {% csrf_token %} !-- 表单内容 -- /formXSS防护from django.utils.html import escape def user_profile(request): user_input request.GET.get(q, ) # 自动转义HTML return render(request, profile.html, {data: escape(user_input)})SQL注入防护# Django ORM自动防护 Book.objects.filter(title__containsrequest.GET.get(query)) # 原始SQL必须使用参数化 from django.db import connection with connection.cursor() as cursor: cursor.execute(SELECT * FROM myapp_book WHERE title %s, [user_input])9. 测试驱动开发9.1 单元测试示例from django.test import TestCase from django.urls import reverse from .models import Author class AuthorTests(TestCase): classmethod def setUpTestData(cls): Author.objects.create(nameTest Author, emailauthorexample.com) def test_author_listing(self): author Author.objects.get(id1) self.assertEqual(author.name, Test Author) self.assertEqual(author.email, authorexample.com) def test_author_list_view(self): response self.client.get(reverse(author-list)) self.assertEqual(response.status_code, 200) self.assertContains(response, Test Author) self.assertTemplateUsed(response, author/list.html)9.2 API测试from rest_framework.test import APITestCase from rest_framework import status class BookAPITests(APITestCase): def test_create_book(self): author Author.objects.create(nameAPI Author) data { title: Django Book, author: author.id, price: 99.99, stock: 10 } response self.client.post(/api/books/, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.data[title], Django Book)10. 常见问题解决方案静态文件404问题确保DEBUGFalse时运行了collectstatic检查Nginx/Apache配置的静态文件路径验证STATIC_ROOT和STATIC_URL设置数据库连接问题# PostgreSQL配置示例 DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: mydatabase, USER: mydatabaseuser, PASSWORD: mypassword, HOST: 127.0.0.1, PORT: 5432, } }时区设置TIME_ZONE Asia/Shanghai USE_TZ True # 建议启用时区支持性能分析工具pip install django-debug-toolbar配置settings.pyINSTALLED_APPS [debug_toolbar] MIDDLEWARE [debug_toolbar.middleware.DebugToolbarMiddleware] INTERNAL_IPS [127.0.0.1]在开发过程中我特别推荐使用django-extensions和ipython组合pip install django-extensions ipython python manage.py shell_plus --ipython这个增强的shell会自动导入所有模型极大提升开发效率。对于复杂查询调试可以使用from django.db import connection print(connection.queries) # 查看已执行的SQL语句