
1. Django入门从零开始搭建第一个项目作为一名Python开发者第一次接触Django框架时难免会感到既兴奋又困惑。Django作为完美主义者的Web框架以其开箱即用的特性著称但这也意味着它自带一整套约定和规则需要学习。让我们从一个真实的开发场景开始假设你刚接到一个简单的任务——创建一个能够展示图书信息的网站。提示在开始前请确保已安装Python 3.6和pip工具。Django 4.2版本需要Python 3.8以上支持。1.1 环境准备与项目创建首先创建一个干净的虚拟环境是Python开发的最佳实践。这能避免不同项目间的依赖冲突python -m venv myenv # 创建虚拟环境 source myenv/bin/activate # 激活环境(Linux/Mac) myenv\Scripts\activate # 激活环境(Windows)安装Django最新稳定版pip install django验证安装成功后就可以创建我们的第一个项目了。Django使用项目(project)和应用(app)两级结构django-admin startproject bookmanager cd bookmanager python manage.py startapp books这个命令会生成如下目录结构bookmanager/ ├── bookmanager/ # 项目配置目录 │ ├── __init__.py │ ├── asgi.py │ ├── settings.py # 核心配置文件 │ ├── urls.py # 主路由配置 │ └── wsgi.py ├── books/ # 新建的app目录 │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations/ │ ├── models.py │ ├── tests.py │ └── views.py └── manage.py # 项目管理脚本1.2 基础配置要点在settings.py中有几个关键配置需要立即修改INSTALLED_APPS [ ... books.apps.BooksConfig, # 注册新建的app ] # 配置数据库(默认使用SQLite) DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } } # 国际化设置 LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai USE_I18N True USE_TZ True注意Django 4.0版本中TIME_ZONE默认使用UTC在开发中文应用时务必修改为本地时区。2. 构建第一个数据模型2.1 定义Book模型在books/models.py中定义我们的图书模型from django.db import models class Book(models.Model): title models.CharField(max_length200, verbose_name书名) author models.CharField(max_length100, verbose_name作者) publish_date models.DateField(verbose_name出版日期) price models.DecimalField(max_digits6, decimal_places2, verbose_name价格) stock models.PositiveIntegerField(default0, verbose_name库存) class Meta: verbose_name 图书 verbose_name_plural verbose_name def __str__(self): return f{self.title}({self.author})这个模型定义了书名(title)字符类型最大长度200作者(author)字符类型最大长度100出版日期(publish_date)日期类型价格(price)十进制数共6位(含2位小数)库存(stock)正整数默认02.2 数据库迁移定义模型后需要生成并应用迁移python manage.py makemigrations python manage.py migrate这两个命令的作用分别是makemigrations根据模型变化生成迁移脚本migrate执行所有未应用的迁移常见问题如果遇到no changes detected错误请检查是否在INSTALLED_APPS中正确注册了app。3. 管理员界面配置Django自带强大的admin界面让我们快速实现数据管理功能。3.1 创建超级用户python manage.py createsuperuser按提示输入用户名、邮箱和密码即可。3.2 注册模型到admin在books/admin.py中from django.contrib import admin from .models import Book admin.register(Book) class BookAdmin(admin.ModelAdmin): list_display (title, author, price, stock) search_fields (title, author) list_filter (author,) ordering (-publish_date,)这样配置后admin界面将提供列表页显示指定字段按书名和作者搜索按作者筛选按出版日期降序排列启动开发服务器python manage.py runserver访问http://127.0.0.1:8000/admin即可登录管理后台。4. 实现基础视图与模板4.1 创建图书列表视图在books/views.py中from django.shortcuts import render from .models import Book def book_list(request): books Book.objects.all().order_by(-publish_date) return render(request, books/list.html, {books: books})4.2 配置URL路由首先在项目主urls.py中包含app的路由from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(books/, include(books.urls)), ]然后在books目录下新建urls.pyfrom django.urls import path from . import views urlpatterns [ path(, views.book_list, namebook_list), ]4.3 创建模板文件在books目录下创建templates/books/list.html!DOCTYPE html html head title图书列表/title /head body h1图书列表/h1 ul {% for book in books %} li{{ book.title }} - {{ book.author }} (¥{{ book.price }})/li {% empty %} li暂无图书信息/li {% endfor %} /ul /body /html现在访问http://127.0.0.1:8000/books/就能看到图书列表了。5. 表单处理与数据创建5.1 创建ModelForm在books/forms.py中(新建文件)from django import forms from .models import Book class BookForm(forms.ModelForm): class Meta: model Book fields __all__ def clean_price(self): price self.cleaned_data[price] if price 0: raise forms.ValidationError(价格必须大于0) return price5.2 添加创建视图更新books/views.pyfrom django.shortcuts import render, redirect from .forms import BookForm def book_create(request): if request.method POST: form BookForm(request.POST) if form.is_valid(): form.save() return redirect(book_list) else: form BookForm() return render(request, books/create.html, {form: form})5.3 创建表单模板新建templates/books/create.htmlform methodpost {% csrf_token %} {{ form.as_p }} button typesubmit保存/button /form5.4 更新URL配置在books/urls.py中添加path(new/, views.book_create, namebook_create),现在可以通过http://127.0.0.1:8000/books/new/添加新书了。6. 项目部署准备6.1 生产环境配置修改settings.py中的关键设置DEBUG False ALLOWED_HOSTS [yourdomain.com, localhost]6.2 静态文件收集Django在生产环境需要单独处理静态文件python manage.py collectstatic6.3 选择WSGI服务器常见选择有GunicornuWSGIWaitress以Gunicorn为例pip install gunicorn gunicorn bookmanager.wsgi:application7. 性能优化建议7.1 数据库查询优化避免N1查询问题# 不好的写法 books Book.objects.all() for book in books: print(book.author.name) # 每次循环都查询数据库 # 好的写法 books Book.objects.select_related(author).all()7.2 缓存策略Django提供多级缓存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, 60*15) # 缓存15分钟 return books7.3 异步任务使用Celery处理耗时操作from celery import shared_task shared_task def update_book_stats(book_id): book Book.objects.get(idbook_id) # 执行耗时计算... book.save()8. 常见问题排查8.1 数据库连接问题错误信息OperationalError: no such table解决方案确认是否执行了迁移检查INSTALLED_APPS是否包含相关app验证数据库连接配置8.2 模板找不到错误错误信息TemplateDoesNotExist解决方案确认TEMPLATES配置中的DIRS设置检查app是否在INSTALLED_APPS中验证模板路径是否符合Django查找规则8.3 CSRF验证失败错误信息CSRF verification failed解决方案确保表单中包含{% csrf_token %}检查MIDDLEWARE中包含django.middleware.csrf.CsrfViewMiddleware对于API请求考虑使用csrf_exempt装饰器或配置CSRF信任源9. 项目结构优化建议随着项目增长建议采用更合理的结构bookmanager/ ├── apps/ # 所有应用放在这里 │ └── books/ ├── config/ # 项目配置 │ ├── settings/ │ │ ├── base.py │ │ ├── dev.py │ │ └── prod.py │ └── urls.py ├── static/ # 静态文件 ├── templates/ # 全局模板 └── manage.py这种结构通过拆分settings文件可以更好地管理不同环境的配置。10. 测试驱动开发实践10.1 编写模型测试在books/tests.py中from django.test import TestCase from .models import Book from django.utils import timezone class BookModelTest(TestCase): def test_create_book(self): book Book.objects.create( title测试图书, author测试作者, publish_datetimezone.now().date(), price39.99, stock10 ) self.assertEqual(book.__str__(), 测试图书(测试作者))10.2 视图测试from django.urls import reverse class BookViewTest(TestCase): def test_book_list_view(self): response self.client.get(reverse(book_list)) self.assertEqual(response.status_code, 200) self.assertContains(response, 图书列表)运行测试python manage.py test11. REST API开发(DRF)11.1 安装DRFpip install djangorestframework11.2 创建序列化器在books/serializers.py中from rest_framework import serializers from .models import Book class BookSerializer(serializers.ModelSerializer): class Meta: model Book fields __all__11.3 实现API视图在books/views.py中from rest_framework import generics from .serializers import BookSerializer class BookListCreateView(generics.ListCreateAPIView): queryset Book.objects.all() serializer_class BookSerializer11.4 配置API路由在books/urls.py中from rest_framework.routers import DefaultRouter from .views import BookListCreateView router DefaultRouter() router.register(rapi/books, BookListCreateView, basenamebook) urlpatterns router.urls现在可以通过/books/api/books/访问REST API了。12. 安全最佳实践12.1 密码哈希确保使用强哈希算法PASSWORD_HASHERS [ django.contrib.auth.hashers.Argon2PasswordHasher, django.contrib.auth.hashers.PBKDF2PasswordHasher, ]12.2 HTTPS配置SECURE_SSL_REDIRECT True SESSION_COOKIE_SECURE True CSRF_COOKIE_SECURE True12.3 敏感数据保护使用环境变量管理敏感信息import os SECRET_KEY os.environ.get(DJANGO_SECRET_KEY) DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: os.environ.get(DB_NAME), USER: os.environ.get(DB_USER), PASSWORD: os.environ.get(DB_PASSWORD), HOST: os.environ.get(DB_HOST), } }13. 异步视图(Django 3.1)13.1 编写异步视图from django.http import JsonResponse from .models import Book async def book_count(request): count await Book.objects.acount() return JsonResponse({count: count})13.2 异步ORM查询async def get_expensive_books(): return await Book.objects.filter(price__gt100).alist()14. 国际化和本地化14.1 翻译字符串在视图和模板中使用from django.utils.translation import gettext as _ def book_list(request): title _(Book List) # ...14.2 生成翻译文件django-admin makemessages -l zh_Hans django-admin compilemessages15. 自定义管理命令15.1 创建命令在books/management/commands/import_books.py中from django.core.management.base import BaseCommand from books.models import Book class Command(BaseCommand): help Import books from CSV def add_arguments(self, parser): parser.add_argument(file, typestr) def handle(self, *args, **options): import csv with open(options[file]) as f: reader csv.DictReader(f) for row in reader: Book.objects.create(**row)使用命令python manage.py import_books books.csv16. 信号系统使用16.1 定义信号处理器在books/signals.py中from django.db.models.signals import post_save from django.dispatch import receiver from .models import Book receiver(post_save, senderBook) def update_book_index(sender, instance, **kwargs): # 更新搜索索引等操作 pass16.2 注册信号在books/apps.py中from django.apps import AppConfig class BooksConfig(AppConfig): default_auto_field django.db.models.BigAutoField name books def ready(self): import books.signals17. 中间件开发17.1 自定义中间件在bookmanager/middleware.py中class BookMiddleware: def __init__(self, get_response): self.get_response get_response def __call__(self, request): # 请求处理前 if /books/ in request.path: request.is_book_section True response self.get_response(request) # 响应处理后 return response17.2 注册中间件在settings.py中MIDDLEWARE [ ... bookmanager.middleware.BookMiddleware, ]18. 高级查询技巧18.1 条件表达式from django.db.models import Case, When, Value books Book.objects.annotate( statusCase( When(stock__gt0, thenValue(有货)), defaultValue(缺货), output_fieldmodels.CharField(), ) )18.2 窗口函数from django.db.models import F, Window from django.db.models.functions import Rank books Book.objects.annotate( rankWindow( expressionRank(), order_byF(price).desc() ) )19. 性能监控19.1 Django Debug Toolbar安装配置pip install django-debug-toolbar在settings.py中INSTALLED_APPS [debug_toolbar] MIDDLEWARE [debug_toolbar.middleware.DebugToolbarMiddleware] INTERNAL_IPS [127.0.0.1]19.2 数据库查询分析from django.db import connection # 在视图或方法中 print(connection.queries) # 打印所有SQL查询20. 项目文档化20.1 使用Sphinx生成文档安装Sphinxpip install sphinx初始化文档sphinx-quickstart docs20.2 编写文档在docs/source/index.rst中添加欢迎来到图书管理系统文档 .. toctree:: :maxdepth: 2 :caption: 内容: modules生成HTML文档cd docs make html21. 持续集成配置21.1 GitHub Actions示例在.github/workflows/test.yml中name: Django CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - name: Set up Python uses: actions/setup-pythonv2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run tests run: | python manage.py test22. 前端集成22.1 使用Django模板系统{% extends base.html %} {% block content %} h1{{ section_title }}/h1 ul {% for book in books %} li class{% cycle odd even %} {{ book.title|upper }} /li {% endfor %} /ul {% endblock %}22.2 集成Vue.js在模板中div idapp {% verbatim %} {{ message }} {% endverbatim %} /div script srchttps://cdn.jsdelivr.net/npm/vue3/script script const app Vue.createApp({ data() { return { message: Hello Vue! } } }).mount(#app) /script23. 部署到云平台23.1 部署到Heroku创建Procfileweb: gunicorn bookmanager.wsgi --log-file -创建runtime.txtpython-3.9.7安装依赖pip install gunicorn whitenoise pip freeze requirements.txt23.2 部署到AWS Elastic Beanstalk创建.ebextensions/django.configoption_settings: aws:elasticbeanstalk:container:python: WSGIPath: bookmanager.wsgi:application24. 性能测试24.1 使用Locust进行负载测试创建locustfile.pyfrom locust import HttpUser, task class BookUser(HttpUser): task def view_books(self): self.client.get(/books/) task(3) def view_admin(self): self.client.get(/admin/)运行测试locust -f locustfile.py25. 项目扩展思路25.1 添加用户认证from django.contrib.auth.decorators import login_required login_required def book_create(request): # ...25.2 实现搜索功能from django.contrib.postgres.search import SearchVector def book_search(request): query request.GET.get(q) results Book.objects.annotate( searchSearchVector(title, author), ).filter(searchquery) return render(request, books/search.html, {results: results})25.3 添加缓存策略from django.views.decorators.cache import cache_page cache_page(60 * 15) # 缓存15分钟 def book_list(request): # ...26. 数据库优化26.1 索引优化在模型中添加索引class Book(models.Model): title models.CharField(max_length200, db_indexTrue) author models.CharField(max_length100) class Meta: indexes [ models.Index(fields[author, publish_date]), ]26.2 分库分表策略使用Django的数据库路由class BookRouter: def db_for_read(self, model, **hints): if model._meta.app_label books: return books_replica return None27. 日志配置27.1 基础日志配置在settings.py中LOGGING { version: 1, handlers: { file: { level: DEBUG, class: logging.FileHandler, filename: debug.log, }, }, loggers: { django: { handlers: [file], level: DEBUG, }, }, }27.2 结构化日志import structlog logger structlog.get_logger() def book_view(request): logger.info(book_view_called, pathrequest.path) # ...28. 异常处理28.1 自定义异常from rest_framework.exceptions import APIException class BookNotFound(APIException): status_code 404 default_detail 请求的图书不存在 default_code book_not_found28.2 全局异常处理from django.http import JsonResponse from django.core.exceptions import PermissionDenied def custom_exception_handler(exc, context): if isinstance(exc, PermissionDenied): return JsonResponse({error: 无权访问}, status403) # 默认处理 response exception_handler(exc, context) return response29. 安全头配置29.1 安全中间件SECURE_BROWSER_XSS_FILTER True SECURE_CONTENT_TYPE_NOSNIFF True X_FRAME_OPTIONS DENY29.2 CSP配置CSP_DEFAULT_SRC (self,) CSP_SCRIPT_SRC (self, cdn.jsdelivr.net) CSP_STYLE_SRC (self, unsafe-inline)30. 项目总结与进阶路线经过这个完整的Django项目实践我们已经覆盖了从项目创建到部署的全流程。在实际开发中还有一些进阶方向值得探索微服务架构将单体应用拆分为多个服务使用Django REST framework构建API网关实时功能集成Django Channels实现WebSocket支持大数据处理结合Celery和Django-Q实现异步任务队列机器学习集成使用Django与scikit-learn/TensorFlow构建智能推荐系统Serverless部署将Django应用部署到AWS Lambda或Google Cloud FunctionsDjango的强大之处在于其包含电池的理念几乎每个常见需求都有成熟的解决方案。随着项目复杂度增加建议深入研究Django的源码实现这能帮助你更好地理解框架的工作原理并在遇到问题时能快速定位和解决。