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. 环境安装与项目创建
# 安装Django
pip install django
# 创建项目
django-admin startproject myproject
# 目录结构:
# myproject/
# manage.py
# myproject/
# __init__.py
# settings.py
# urls.py
# asgi.py
# wsgi.py
2. 创建应用
python manage.py startapp myapp
3. 基础视图与URL配置

myapp/views.py:

from django.http import HttpResponse
def hello(request):
# 简单视图函数
return HttpResponse("Hello Django!"
)

myproject/urls.py:

from django.urls import path
from myapp import views
urlpatterns = [
path('hello/'
, views.hello)
,
]
4. 运行开发服务器
python manage.py runserver
# 访问 http://127.0.0.1:8000/hello/

Django 模型层

1. 定义模型

myapp/models.py:

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:

INSTALLED_APPS = [
...
'myapp.apps.MyappConfig'
, # 添加应用
]
3. 数据库迁移
python manage.py makemigrations # 创建迁移文件
python manage.py migrate # 应用迁移
4. 数据库操作示例
# 创建记录
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:

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:

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:

TEMPLATES = [
{
'DIRS': [BASE_DIR / 'templates']
, # 全局模板目录
}
,
]
2. 基础模板 templates/base.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
{% 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:

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:

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
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
<button type="submit">Save</button>
</form>

Django Admin 后台

1. 注册模型

myapp/admin.py:

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. 创建管理员
python manage.py createsuperuser

Django 用户认证

1. 登录视图

myproject/urls.py:

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
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
<button type="submit">Login</button>
</form>
3. 视图权限控制
from django.contrib.auth.mixins import LoginRequiredMixin
class SecretView(LoginRequiredMixin, TemplateView):
template_name = 'secret.html'
login_url = '/login/' # 未登录重定向

Django REST Framework (DRF)

1. 安装与配置
pip install djangorestframework

settings.py:

INSTALLED_APPS = [
...
'rest_framework'
,
]
2. 序列化器

myapp/serializers.py:

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

myapp/views.py:

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:

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:

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:

MIDDLEWARE = [
...
'myapp.middleware.SimpleMiddleware'
,
]

Django 信号

1. 定义信号处理器

myapp/signals.py:

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:

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:

from django.views.decorators.cache import cache_page
@cache_page
(60 * 15
) # 缓存15分钟
def expensive_view(request):
# 耗时操作
return HttpResponse(...
)
2. 模板片段缓存
{% load cache %}
{% cache 500 sidebar %}
<!-- 缓存500秒的侧边栏内容 -->
  ...
  {% endcache %}

Django 国际化和本地化

1. 配置多语言

settings.py:

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
LANGUAGES = [
('en'
, 'English'
)
,
('zh-hans'
, '简体中文'
)
,
]
2. 标记翻译文本

views.py:

from django.utils.translation import gettext as _
def greeting(request):
message = _("Welcome to our site!"
)
return HttpResponse(message)
3. 模板翻译
{% load i18n %}
<h1>{% trans "Welcome to our website" %}</h1>
<p>{% blocktrans %}Today is {{ current_date }}{% endblocktrans %}</p>

Django 安全实践

1. CSRF 保护
<!-- 表单中必须包含 -->
  {% csrf_token %}
2. XSS 防护
# 模板自动转义
{
{
user_input
}
}
# 标记安全内容
from django.utils.safestring import mark_safe
safe_html = mark_safe("<b>Safe content</b>"
)
3. Clickjacking 防护

settings.py:

SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'
SECURE_BROWSER_XSS_FILTER = True

Django 部署配置

1. 生产环境设置

settings.py:

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. 收集静态文件
python manage.py collectstatic
3. WSGI 配置

wsgi.py:

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:

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. 运行测试
python manage.py test

Django 高级特性

1. 数据库事务
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:

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. 异步视图
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
pip install django-debug-toolbar

settings.py:

INSTALLED_APPS = [
# ...
"debug_toolbar"
,
]
MIDDLEWARE = [
# ...
"debug_toolbar.middleware.DebugToolbarMiddleware"
,
]
INTERNAL_IPS = ["127.0.0.1"]
2. Django Celery
# tasks.py
from celery import shared_task
@shared_task
def send_email_task(email):
# 发送邮件逻辑
pass
# 调用任务
send_email_task.delay("user@example.com"
)

Django 性能优化

1. 查询优化
# 避免N+1查询问题
books = Book.objects.select_related('author'
).all(
)
# 使用prefetch_related
authors = Author.objects.prefetch_related('books'
).all(
)
2. 数据库索引

models.py:

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:

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:

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:

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

views.py:

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:

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. 运行命令
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版)(博文视点出品)电子工业出版社★★★★★
posted @ 2025-07-16 10:31  yjbjingcha  阅读(34)  评论(0)    收藏  举报