Python Django完整教程与代码示例

边写代码零食不停口 盼盼麦香鸡味块卡乐比(Calbee)薯条三兄弟 独立小包好时kisses多口味巧克力糖老金磨方【黑金系列】黑芝麻丸

边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士+【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵

别光顾写代码更要多喝茶水,提神有营养 六安瓜片茶叶茶香二级200g 2025年新茶雨前盒装自己喝

让AI成为我们的得力助手:《用Cursor玩转AI辅助编程------不写代码也能做软件开发》


Python Django 简介

Django 是一个基于 Python 的高级 Web 开发框架 ,遵循 "MTV" (模型-模板-视图)设计模式(类似于 MVC)。它以 高效、安全、可扩展 著称,帮助开发者快速构建高质量的 Web 应用。


🚀 核心特点

  1. 开箱即用
    • 自带用户认证、后台管理、ORM、表单处理等模块。
    • 无需重复造轮子,大幅提升开发效率。
  2. 安全优先
    • 自动防御 SQL 注入、XSS、CSRF 等常见攻击。
  3. 高可扩展性
    • 支持从小型博客到百万级用户平台(如 Instagram、Pinterest)。
  4. DRY 原则
    • 遵循 Don't Repeat Yourself,代码高度复用。

🧩 核心组件

组件 作用
模型 (Model) 用 Python 类定义数据结构,自动生成数据库表(支持 PostgreSQL/MySQL 等)。
视图 (View) 处理业务逻辑,接收请求并返回响应(HTML/JSON 等)。
模板 (Template) 用 HTML + Django 模板语法动态渲染页面。
路由 (URLconf) 将 URL 映射到对应的视图函数。

⚙️ 工作流程

graph LR A[用户请求] --> B(URL路由) B --> C[视图处理] C --> D{操作数据库?} D -- 是 --> E[模型读写] E --> F[返回数据] D -- 否 --> G[直接响应] F --> H[模板渲染] H --> I[返回HTML] G --> I

📦 Django 自带工具

  • Admin 后台:自动生成数据管理界面。
  • ORM 系统:用 Python 操作数据库,无需写 SQL。
  • 表单处理:验证用户输入并自动渲染表单。
  • 缓存机制:支持 Memcached、Redis 等提升性能。
  • 国际化:内置多语言支持。

Django 基础部分

1. 环境安装与项目创建
python 复制代码
# 安装Django
pip install django

# 创建项目
django-admin startproject myproject

# 目录结构:
# myproject/
#   manage.py
#   myproject/
#       __init__.py
#       settings.py
#       urls.py
#       asgi.py
#       wsgi.py
2. 创建应用
bash 复制代码
python manage.py startapp myapp
3. 基础视图与URL配置

myapp/views.py:

python 复制代码
from django.http import HttpResponse

def hello(request):
    # 简单视图函数
    return HttpResponse("Hello Django!")

myproject/urls.py:

python 复制代码
from django.urls import path
from myapp import views

urlpatterns = [
    path('hello/', views.hello),
]
4. 运行开发服务器
bash 复制代码
python manage.py runserver
# 访问 http://127.0.0.1:8000/hello/

Django 模型层

1. 定义模型

myapp/models.py:

python 复制代码
from django.db import models

class Book(models.Model):
    # 字符字段,最大长度100
    title = models.CharField(max_length=100)
    
    # 作者字段,可为空
    author = models.CharField(max_length=50, null=True)
    
    # 出版日期
    pub_date = models.DateField()
    
    # 价格(带小数)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    
    # 自动记录创建时间
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title
2. 激活模型

myproject/settings.py:

python 复制代码
INSTALLED_APPS = [
    ...
    'myapp.apps.MyappConfig',  # 添加应用
]
3. 数据库迁移
bash 复制代码
python manage.py makemigrations  # 创建迁移文件
python manage.py migrate         # 应用迁移
4. 数据库操作示例
python 复制代码
# 创建记录
from myapp.models import Book
from datetime import date

book = Book.objects.create(
    title="Django for Beginners",
    author="William S. Vincent",
    pub_date=date(2023, 5, 15),
    price=29.99
)

# 查询记录
books = Book.objects.filter(price__lt=30)  # 价格<30的书籍
recent_books = Book.objects.order_by('-pub_date')[:5]  # 最新5本书

# 更新记录
book.price = 24.99
book.save()

# 删除记录
book.delete()

Django 视图进阶

1. 类视图

myapp/views.py:

python 复制代码
from django.views.generic import ListView, DetailView
from .models import Book

class BookListView(ListView):
    model = Book
    template_name = 'book_list.html'
    context_object_name = 'books'

class BookDetailView(DetailView):
    model = Book
    template_name = 'book_detail.html'
    pk_url_kwarg = 'book_id'  # URL中的参数名
2. URL配置

myapp/urls.py:

python 复制代码
from django.urls import path
from .views import BookListView, BookDetailView

urlpatterns = [
    path('books/', BookListView.as_view(), name='book-list'),
    path('books/<int:book_id>/', BookDetailView.as_view(), name='book-detail'),
]

Django 模板系统

1. 模板配置

myproject/settings.py:

python 复制代码
TEMPLATES = [
    {
        'DIRS': [BASE_DIR / 'templates'],  # 全局模板目录
    },
]
2. 基础模板 templates/base.html
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <nav>...</nav>
    <div class="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
3. 子模板 templates/book_list.html
html 复制代码
{% extends "base.html" %}

{% block title %}Book List{% endblock %}

{% block content %}
<h1>Book List</h1>
<ul>
    {% for book in books %}
    <li>
        <a href="{% url 'book-detail' book.id %}">
            {{ book.title }} - {{ book.author }}
        </a>
    </li>
    {% empty %}
    <li>No books available</li>
    {% endfor %}
</ul>
{% endblock %}

Django 表单处理

1. 模型表单

myapp/forms.py:

python 复制代码
from django import forms
from .models import Book

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'pub_date', 'price']
        widgets = {
            'pub_date': forms.DateInput(attrs={'type': 'date'}),
        }
2. 表单视图

myapp/views.py:

python 复制代码
from django.views.generic.edit import CreateView
from .forms import BookForm

class BookCreateView(CreateView):
    model = Book
    form_class = BookForm
    template_name = 'book_form.html'
    success_url = '/books/'  # 提交成功后重定向
3. 模板 templates/book_form.html
html 复制代码
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>

Django Admin 后台

1. 注册模型

myapp/admin.py:

python 复制代码
from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'price', 'pub_date')
    list_filter = ('author', 'pub_date')
    search_fields = ('title', 'author')
    date_hierarchy = 'pub_date'
2. 创建管理员
bash 复制代码
python manage.py createsuperuser

Django 用户认证

1. 登录视图

myproject/urls.py:

python 复制代码
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
2. 登录模板 templates/login.html
html 复制代码
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
</form>
3. 视图权限控制
python 复制代码
from django.contrib.auth.mixins import LoginRequiredMixin

class SecretView(LoginRequiredMixin, TemplateView):
    template_name = 'secret.html'
    login_url = '/login/'  # 未登录重定向

Django REST Framework (DRF)

1. 安装与配置
bash 复制代码
pip install djangorestframework

settings.py:

python 复制代码
INSTALLED_APPS = [
    ...
    'rest_framework',
]
2. 序列化器

myapp/serializers.py:

python 复制代码
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
3. API视图

myapp/views.py:

python 复制代码
from rest_framework import generics
from .serializers import BookSerializer

class BookAPIList(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

class BookAPIDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
4. API路由

myapp/urls.py:

python 复制代码
from django.urls import path
from .views import BookAPIList, BookAPIDetail

urlpatterns = [
    path('api/books/', BookAPIList.as_view()),
    path('api/books/<int:pk>/', BookAPIDetail.as_view()),
]

Django 中间件

1. 自定义中间件

myapp/middleware.py:

python 复制代码
class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 请求处理前
        print("Before view")
        
        response = self.get_response(request)
        
        # 响应返回前
        print("After view")
        return response
2. 注册中间件

settings.py:

python 复制代码
MIDDLEWARE = [
    ...
    'myapp.middleware.SimpleMiddleware',
]

Django 信号

1. 定义信号处理器

myapp/signals.py:

python 复制代码
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Book

@receiver(post_save, sender=Book)
def book_created(sender, instance, created, **kwargs):
    if created:
        print(f"New book created: {instance.title}")
2. 注册信号

myapp/apps.py:

python 复制代码
from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        import myapp.signals  # 导入信号处理器

Django 缓存

1. 视图缓存

views.py:

python 复制代码
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # 缓存15分钟
def expensive_view(request):
    # 耗时操作
    return HttpResponse(...)
2. 模板片段缓存
html 复制代码
{% load cache %}

{% cache 500 sidebar %}
    <!-- 缓存500秒的侧边栏内容 -->
    ...
{% endcache %}

Django 国际化和本地化

1. 配置多语言

settings.py:

python 复制代码
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True

LANGUAGES = [
    ('en', 'English'),
    ('zh-hans', '简体中文'),
]
2. 标记翻译文本

views.py:

python 复制代码
from django.utils.translation import gettext as _

def greeting(request):
    message = _("Welcome to our site!")
    return HttpResponse(message)
3. 模板翻译
html 复制代码
{% load i18n %}

<h1>{% trans "Welcome to our website" %}</h1>
<p>{% blocktrans %}Today is {{ current_date }}{% endblocktrans %}</p>

Django 安全实践

1. CSRF 保护
html 复制代码
<!-- 表单中必须包含 -->
{% csrf_token %}
2. XSS 防护
python 复制代码
# 模板自动转义
{{ user_input }} 

# 标记安全内容
from django.utils.safestring import mark_safe
safe_html = mark_safe("<b>Safe content</b>")
3. Clickjacking 防护

settings.py:

python 复制代码
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
SECURE_BROWSER_XSS_FILTER = True

Django 部署配置

1. 生产环境设置

settings.py:

python 复制代码
DEBUG = False

ALLOWED_HOSTS = ['example.com']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydbuser',
        'PASSWORD': 'mypassword',
        'HOST': 'db.example.com',
        'PORT': '5432',
    }
}

# 静态文件配置
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATIC_URL = '/static/'
2. 收集静态文件
bash 复制代码
python manage.py collectstatic
3. WSGI 配置

wsgi.py:

python 复制代码
import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_wsgi_application()

Django 测试框架

1. 编写测试用例

tests.py:

python 复制代码
from django.test import TestCase
from django.urls import reverse
from .models import Book

class BookTests(TestCase):
    def setUp(self):
        self.book = Book.objects.create(
            title="Test Book",
            author="Test Author",
            price=19.99
        )
    
    def test_book_listing(self):
        self.assertEqual(f"{self.book.title}", "Test Book")
        self.assertEqual(f"{self.book.author}", "Test Author")
    
    def test_book_list_view(self):
        response = self.client.get(reverse('book-list'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "Test Book")
2. 运行测试
bash 复制代码
python manage.py test

Django 高级特性

1. 数据库事务
python 复制代码
from django.db import transaction

@transaction.atomic
def transfer_funds(sender, receiver, amount):
    sender.balance -= amount
    sender.save()
    
    # 如果此处出错,整个事务回滚
    receiver.balance += amount
    receiver.save()
2. 自定义模板标签

templatetags/my_tags.py:

python 复制代码
from django import template

register = template.Library()

@register.simple_tag
def current_time(format_string):
    from datetime import datetime
    return datetime.now().strftime(format_string)
3. 异步视图
python 复制代码
from django.http import HttpResponse
from asgiref.sync import async_to_sync

async def async_view(request):
    # 异步操作示例
    await some_async_task()
    return HttpResponse("Async response")

Django 第三方包集成

1. Django Debug Toolbar
bash 复制代码
pip install django-debug-toolbar

settings.py:

python 复制代码
INSTALLED_APPS = [
    # ...
    "debug_toolbar",
]

MIDDLEWARE = [
    # ...
    "debug_toolbar.middleware.DebugToolbarMiddleware",
]

INTERNAL_IPS = ["127.0.0.1"]
2. Django Celery
python 复制代码
# tasks.py
from celery import shared_task

@shared_task
def send_email_task(email):
    # 发送邮件逻辑
    pass

# 调用任务
send_email_task.delay("[email protected]")

Django 性能优化

1. 查询优化
python 复制代码
# 避免N+1查询问题
books = Book.objects.select_related('author').all()

# 使用prefetch_related
authors = Author.objects.prefetch_related('books').all()
2. 数据库索引

models.py:

python 复制代码
class Book(models.Model):
    title = models.CharField(max_length=100, db_index=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    
    class Meta:
        indexes = [
            models.Index(fields=['price'], name='price_idx'),
        ]
3. 分页处理

views.py:

python 复制代码
from django.core.paginator import Paginator

def book_list(request):
    book_list = Book.objects.all()
    paginator = Paginator(book_list, 25)  # 每页25条
    
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'list.html', {'page_obj': page_obj})

Django 文件上传

1. 模型配置

models.py:

python 复制代码
class Document(models.Model):
    title = models.CharField(max_length=100)
    file = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)
2. 表单处理

forms.py:

python 复制代码
class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ['title', 'file']
3. 视图处理

views.py:

python 复制代码
def upload_file(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('success')
    else:
        form = DocumentForm()
    return render(request, 'upload.html', {'form': form})

Django 自定义管理命令

1. 创建命令

management/commands/import_books.py:

python 复制代码
from django.core.management.base import BaseCommand
from myapp.models import Book

class Command(BaseCommand):
    help = 'Import books from CSV'

    def add_arguments(self, parser):
        parser.add_argument('csv_file', type=str)

    def handle(self, *args, **options):
        import csv
        with open(options['csv_file']) as f:
            reader = csv.DictReader(f)
            for row in reader:
                Book.objects.create(
                    title=row['title'],
                    author=row['author'],
                    price=row['price']
                )
        self.stdout.write(self.style.SUCCESS('Successfully imported books'))
2. 运行命令
bash 复制代码
python manage.py import_books books.csv

✅ 为什么选择 Django?

  • 开发速度快:脚手架工具自动化项目初始化。
  • 社区强大:海量第三方包(Django Packages 官网超 5,000+ 插件)。
  • 文档完善:官方教程详细,适合新手到专家所有阶段。

💡 提示:Django 的 "约定优于配置" 理念减少了决策成本,让开发者聚焦业务逻辑。


📚 学习资源

掌握 Django 后,将能高效构建从简单博客到复杂企业级应用的全栈项目! 🚀


Python 图书推荐

书名 出版社 推荐
Python编程 从入门到实践 第3版(图灵出品) 人民邮电出版社 ★★★★★
Python数据科学手册(第2版)(图灵出品) 人民邮电出版社 ★★★★★
图形引擎开发入门:基于Python语言 电子工业出版社 ★★★★★
科研论文配图绘制指南 基于Python(异步图书出品) 人民邮电出版社 ★★★★★
Effective Python:编写好Python的90个有效方法(第2版 英文版) 人民邮电出版社 ★★★★★
Python人工智能与机器学习(套装全5册) 清华大学出版社 ★★★★★

JAVA 图书推荐

书名 出版社 推荐
Java核心技术 第12版:卷Ⅰ+卷Ⅱ 机械工业出版社 ★★★★★
Java核心技术 第11版 套装共2册 机械工业出版社 ★★★★★
Java语言程序设计基础篇+进阶篇 原书第12版 套装共2册 机械工业出版社 ★★★★★
Java 11官方参考手册(第11版) 清华大学出版社 ★★★★★
Offer来了:Java面试核心知识点精讲(第2版)(博文视点出品) 电子工业出版社 ★★★★★
相关推荐
程序员的世界你不懂1 小时前
Appium+python自动化(八)- 认识Appium- 下章
python·appium·自动化
恸流失2 小时前
DJango项目
后端·python·django
Julyyyyyyyyyyy3 小时前
【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
python·selenium·pycharm·自动化
潘yi.3 小时前
NoSQL之Redis配置与优化
数据库·redis·nosql
zdkdchao3 小时前
hbase资源和数据权限控制
大数据·数据库·hbase
伤不起bb3 小时前
NoSQL 之 Redis 配置与优化
linux·运维·数据库·redis·nosql
leo__5203 小时前
PostgreSQL配置文件修改及启用方法
数据库·postgresql
蓝婷儿4 小时前
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
开发语言·python·学习
love530love4 小时前
【笔记】在 MSYS2(MINGW64)中正确安装 Rust
运维·开发语言·人工智能·windows·笔记·python·rust
水银嘻嘻4 小时前
05 APP 自动化- Appium 单点触控& 多点触控
python·appium·自动化