掌握Django框架:书籍源代码实战指南
MVT架构模式是Django框架的核心组成部分,它代表Model-View-Template三个单词的缩写,分别对应模型、视图和模板三个主要组件。MVT是MVC(Model-View-Controller)架构模式的一种变体,专为Web应用设计,其核心思想是实现关注点分离(Separation of Concerns),即将数据模型、业务逻辑和用户界面分离。MVT中的Model负责与数据库进行交互
简介:《Django书籍随书源代码》提供了一系列Python Django框架项目和示例代码,供开发者深入学习。Django框架支持快速开发和“DRY”设计原则,其核心包括模型、视图、模板和URL路由等组件。zip文件中的 djangoweb 文件夹展示了这些核心组件的具体实现,包括数据结构的模型定义、视图处理逻辑、模板内容生成以及URL配置。此外,还涉及管理员界面、中间件、配置设置和测试等方面,是提升Django开发技能的宝贵资料。 
1. Django框架学习资源
1.1 Django入门资源
Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。作为初学者,首先了解Django的官方文档是关键。官方文档是获取最新和最准确信息的首要来源。接下来,可以利用在线课程或视频教程,它们通常覆盖了从安装Django到构建第一个项目的基础知识。最后,加入Django的社区,如Django论坛、Stack Overflow以及各种交流群组,与其他开发者交流经验。
1.2 推荐书籍与在线课程
为了更深入地学习Django,推荐《Django by Example》和《Two Scoops of Django》这两本经典图书。这些书籍能够帮助开发者了解Django的实际应用案例,以及最佳实践。在线课程如Udemy、Coursera上也有许多高质量的课程,它们往往包含实战项目,有助于学习者通过实践来加深理解。
1.3 实战项目与开发工具
完成理论学习之后,通过实战项目来巩固知识是非常重要的。可以从简单的博客系统或者待办事项列表开始,逐步增加功能,如用户认证、支付集成、社交媒体分享等。在开发过程中,熟练使用Django开发工具和IDE,如PyCharm、VSCode等,可以帮助你更高效地编写代码和调试。学会使用版本控制系统如Git,对项目的版本管理和团队协作至关重要。
通过本章内容,你将获得有关Django学习资源的全面概述,从而为接下来深入学习Django框架打下坚实基础。
2. MVT设计模式详解与实践
2.1 MVT架构模型概述
2.1.1 MVT架构简介
MVT架构模式是Django框架的核心组成部分,它代表Model-View-Template三个单词的缩写,分别对应模型、视图和模板三个主要组件。MVT是MVC(Model-View-Controller)架构模式的一种变体,专为Web应用设计,其核心思想是实现关注点分离(Separation of Concerns),即将数据模型、业务逻辑和用户界面分离。
MVT中的Model负责与数据库进行交互,管理数据和数据结构。View充当业务逻辑层的角色,它接收用户的输入,处理并返回数据。Template则负责展示内容,它将Model和View处理后的数据以某种形式呈现给用户。
2.1.2 MVT与MVC的对比
MVT和MVC虽然名字相似,但在Web应用中有一些不同的实践方式。在MVC模式中,控制器(Controller)是应用程序的核心,负责接收请求、调用模型(Model)进行数据处理,以及选择视图(View)进行渲染输出。而在MVT模式中,Django提供了一个名为URL路由的组件,它可以根据URL模式来将请求分发给不同的视图函数或类视图,视图则直接与模型交互,并把数据传递给模板进行渲染。
MVT模式特别适合Python和Django的开发哲学,它简化了开发者的工作,使得编写Web应用更加直观和快速。Django框架已经为这些组件提供了大量内置功能,使得开发者可以专注于业务逻辑和用户界面的开发。
2.2 Model的设计与实现
2.2.1 模型的定义与数据迁移
在Django中,Model是使用Python类来表示的,并且每个模型类都对应数据库中的一个表。开发者需要在Django应用的 models.py 文件中定义模型类,并指定字段类型。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
publish_date = models.DateTimeField(auto_now_add=True)
在上面的代码示例中,我们定义了一个 Article 模型,包含标题、内容和发布日期三个字段。定义好模型后,需要生成数据迁移文件并应用到数据库中。
python manage.py makemigrations
python manage.py migrate
这两条命令分别创建迁移文件并应用迁移到数据库,从而创建出对应的表结构。
2.2.2 模型关系的建立与查询
Django模型支持多种关系,包括一对多、多对多和一对一。这些关系通过字段类型 ForeignKey 、 ManyToManyField 和 OneToOneField 来实现。
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
content = models.TextField()
author = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
在这个例子中, Comment 模型与 Article 模型通过 ForeignKey 建立了一对多关系,每个文章可以有多个评论。查询数据库时,Django提供了一个强大的对象关系映射(ORM)系统,支持复杂的查询操作。
from django.shortcuts import get_object_or_404
article = get_object_or_404(Article, pk=1)
comments = article.comment_set.all()
这段代码使用了Django的ORM特性,通过 article.comment_set.all() 查询到了ID为1的文章的所有评论。
2.3 View的逻辑处理
2.3.1 视图函数与类视图
视图(View)在Django中是处理HTTP请求的函数或者类。视图函数接收一个请求(request)对象和可能的位置参数或关键字参数,并返回一个响应(response)对象。
from django.http import HttpResponse
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'article_list.html', {'articles': articles})
视图也可以使用类的形式来实现,类视图通过继承自 View 类或其子类,并重写方法来处理不同的HTTP请求。
from django.views import View
from django.http import HttpResponse
from .models import Article
class ArticleListView(View):
def get(self, request, *args, **kwargs):
articles = Article.objects.all()
return render(request, 'article_list.html', {'articles': articles})
类视图对于实现常见的CRUD操作非常有用,尤其是当视图逻辑相对复杂时,类视图可以提高代码的可读性和可重用性。
2.3.2 分发请求到视图函数
Django使用URL配置将特定的URL模式映射到对应的视图函数。URL配置可以定义在应用的 urls.py 文件中,并在项目的主 urls.py 中进行包含。
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list, name='article_list'),
path('articles/<int:pk>/', views.article_detail, name='article_detail'),
]
在上面的URL配置中, path 函数定义了两个URL模式, articles/ 模式映射到 article_list 视图, articles/<int:pk>/ 模式映射到 article_detail 视图,并通过 <int:pk> 捕获了一个名为 pk 的参数。
2.4 Template的动态内容渲染
2.4.1 模板语法基础
Django模板系统是一个强大的工具,它允许开发者定义页面的HTML结构,并动态插入数据。模板使用 .html 文件作为模板文件,Django模板语言(DTL)提供了一系列标签和过滤器来实现动态内容渲染。
<!DOCTYPE html>
<html>
<head>
<title>Article List</title>
</head>
<body>
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content|truncatewords:30 }}</p>
{% endfor %}
</body>
</html>
在这个示例中, {% for article in articles %} 和 {% endfor %} 标签用于遍历文章列表, {{ article.title }} 和 {{ article.content|truncatewords:30 }} 分别用于输出文章标题和内容,其中 truncatewords:30 是一个过滤器,用来截取文章内容的前30个词。
2.4.2 模板继承与包含
Django模板支持模板继承,允许开发者创建一个基础模板,并在子模板中进行扩展。基础模板定义了一个页面的框架,而子模板则填充具体内容。
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
在子模板中,使用 {% extends 'base.html' %} 声明继承自 base.html ,然后使用 {% block %} 标签定义自己的内容。
<!-- article_list.html -->
{% extends 'base.html' %}
{% block title %}Article List{% endblock %}
{% block content %}
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
{% endfor %}
{% endblock %}
这样,子模板 article_list.html 继承了基础模板 base.html 的结构,并重写了 title 和 content 块,实现了模板的复用和扩展。
通过模板继承和包含,开发者可以有效地管理大型项目中的模板文件,减少重复代码,提高开发效率。
3. 数据模型与数据库交互深入
Django框架中的数据模型是构成Web应用的基础。数据模型定义了数据库中的数据结构,它们代表了应用中的数据和数据之间的关系。Django的模型层为开发者提供了一种高级的、抽象的方式去操作数据库,使得数据库操作变得直观和简单。
3.1 数据库配置与迁移
3.1.1 数据库的配置选项
在Django中,数据库的配置通常位于项目的 settings.py 文件中的 DATABASES 字典内。Django支持多种数据库后端,包括PostgreSQL, MySQL, SQLite和Oracle。配置的结构通常如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
在配置选项中, 'ENGINE' 指定了使用的数据库后端, 'NAME' 则是数据库文件的路径或数据库名称。其它选项如 'USER' , 'PASSWORD' , 'HOST' , 'PORT' 等分别用于指定数据库的用户名、密码、主机名和端口。
3.1.2 数据迁移的原理与操作
数据迁移是数据库版本控制的一种方式,允许开发者描述数据库的结构,然后让Django帮你同步数据库的结构到你的模型结构。每个模型的改变都可以通过一个迁移文件来追踪。
Django的迁移系统是通过一系列的迁移文件实现的,它们记录了数据库应如何改变。以下是一些基本的迁移命令:
python manage.py makemigrations: 为应用创建新的迁移文件。python manage.py migrate: 应用所有的迁移文件到数据库中。python manage.py showmigrations: 显示所有已创建的迁移文件及其状态。
迁移文件的创建和应用是将你的数据模型同步到数据库的关键。
3.2 模型操作与数据库交互
3.2.1 模型字段详解
模型的每个字段都映射到数据库中的列,并提供了字段特定的额外功能。例如:
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
这里, name 字段被映射为一个字符类型( CharField ),而 tagline 字段被映射为一个文本类型( TextField )。Django提供了一系列的标准字段类型,如 BooleanField , DateField , EmailField 等。
3.2.2 查询集与数据库操作
查询集(QuerySet)是Django ORM中强大的特性之一,它表示从数据库获取对象集合的一种查询。查询集可以使用链式操作,如过滤、排序、分页等。示例如下:
Entry.objects.filter(author__name='John')
这个查询集表示从 Entry 模型中获取所有作者名为’John’的条目。Django使用字段名与字段值之间的双下划线( __ )来表示跨关系的过滤。
3.3 数据库事务管理
3.3.1 事务的基本概念
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个或多个操作序列组成。事务具有原子性、一致性、隔离性和持久性四个属性,统称为ACID属性。
3.3.2 Django中的事务应用
在Django中,事务可以通过装饰器或上下文管理器来控制。例如,使用装饰器来确保视图中的某些操作是事务性的:
from django.db import transaction
@transaction.atomic
def viewfunc(request):
do_something()
在这个例子中, @transaction.atomic 装饰器确保 do_something() 函数中的所有数据库操作要么全部成功,要么全部回滚,从而维护事务的原子性。
以上章节只是Django数据模型与数据库交互深入知识的一小部分。在下一节中,我们会继续深入探讨视图与请求处理策略,了解如何利用Django框架来高效处理HTTP请求。
4. 视图与请求处理策略
视图是Web框架中处理请求并生成响应的组件。在Django中,视图负责处理逻辑和数据,并通过模板来创建HTML页面。本章节将深入探讨Django视图的高级用法、处理各种HTTP请求以及请求分发机制。
4.1 视图的高级用法
4.1.1 基于类的视图
基于类的视图提供了一种面向对象的方式来组织代码,使得视图逻辑更易于管理和重用。Django框架提供了多种内置的基于类的视图,如 ListView , DetailView , CreateView 等,它们各自封装了一些常见的操作,如分页、表单处理等。
示例:使用ListView展示文章列表
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'article_list'
上面的代码定义了一个 ArticleListView 类视图,用于展示数据库中 Article 模型的所有对象。 ListView 自动处理了模型查询,并将对象列表作为上下文传递给模板。
参数解释:
model: 指定关联的模型类。template_name: 指定使用的模板文件名。context_object_name: 自定义模板中使用的变量名,默认为object_list。
4.1.2 视图装饰器的应用
装饰器是Python语言的一个特性,用于修改函数的行为。Django也提供了装饰器来增强视图的功能,比如 login_required 装饰器可以限制只有登录用户才能访问某个视图。
示例:限制访问视图
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def my_protected_view(request):
return render(request, 'protected_page.html')
上述代码中, login_required 装饰器用于确保只有通过身份验证的用户可以访问 my_protected_view 视图。如果用户未登录,则会被重定向到登录页面。
装饰器在Django中提供了一种灵活的方式来扩展视图功能,不改变原有视图结构的情况下增加额外的逻辑处理。
4.2 处理各种HTTP请求
4.2.1 请求与响应对象
每个视图函数都会接收一个 HttpRequest 对象作为第一个参数,这是Django处理客户端请求的数据结构。它包含了请求的URL、HTTP方法、GET和POST参数等信息。视图函数需要返回一个 HttpResponse 对象或其子类的对象作为响应。
示例:处理GET请求并返回JSON响应
from django.http import JsonResponse
def get_user(request):
user_id = request.GET.get('id', None)
if user_id:
user = User.objects.filter(id=user_id).first()
data = {
'name': user.name,
'email': user.email
}
return JsonResponse(data)
else:
return JsonResponse({'error': 'User ID not provided'}, status=400)
在上述示例中,视图函数 get_user 接收一个GET请求,根据提供的 id 查询用户信息,并以JSON格式返回。如果未提供 id 参数,将返回一个包含错误信息的JSON响应。
4.2.2 处理表单与文件上传
表单处理是Web开发中常见的需求。Django提供了一个 Form 类,用于定义表单字段和验证逻辑。在视图中处理表单数据包括验证输入数据和处理表单提交的结果。
示例:处理表单提交
from django.shortcuts import render, redirect
from .forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# 处理表单数据
form.save()
return redirect('contact_success_url')
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
在这个例子中, ContactForm 是一个表单类,用于定义联系表单的字段。视图 contact 检查请求方法是否为POST,如果是,则创建表单实例并验证数据。如果表单数据有效,将执行数据保存操作,并重定向到成功页面。如果请求不是POST方法,则返回未填充的表单。
4.3 请求分发机制
4.3.1 Django的URL分发原理
Django的URL分发机制是将URL请求映射到视图函数或类视图。这一过程由 urls.py 文件中的 urlpatterns 列表定义,列表中包含了一系列的URL模式与视图之间的映射关系。
示例:URL模式的定义
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
在这个URL配置中,我们定义了三个URL模式,它们分别指向不同的视图函数。每个模式中使用的尖括号 <...> 用于从URL中捕获值,并将这些值作为参数传递给视图函数。
4.3.2 URL模式的正则表达式
虽然Django提供了便捷的方式定义URL模式,但在某些复杂情况下,开发者可能需要使用正则表达式来精确控制URL匹配逻辑。
示例:使用正则表达式定义URL模式
from django.urls import re_path
urlpatterns = [
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
通过使用 re_path ,我们可以在URL模式中应用复杂的正则表达式。在这个例子中,我们为 year_archive , month_archive 和 article_detail 视图函数定义了具有命名捕获组的正则表达式,这样我们可以通过名称访问这些捕获的值。
本章节深入探讨了Django视图的高级用法,详细介绍了处理各种HTTP请求的方法以及请求分发机制的原理和操作。通过具体的代码示例和逻辑分析,我们能够更好地理解如何在Django项目中实现复杂的业务逻辑和用户交互。
5. 模板系统与动态内容展示
在Django Web开发中,模板系统是将数据呈现为HTML或其他格式输出的核心组件。它提供了一种将Django后端数据和逻辑与前端设计分离的方式,使得开发者可以专注于各自的领域。模板系统不仅包括基本的标签和过滤器,还涉及到模板的继承和复用,以及更高级的动态内容生成技术。
5.1 模板标签与过滤器应用
模板系统中,标签和过滤器是让模板能够展示动态内容的关键元素。标签用于控制模板的逻辑结构,如循环和条件判断,而过滤器用于对数据进行格式化处理。
5.1.1 内置模板标签与过滤器
Django自带了许多内置的模板标签和过滤器,它们提供了丰富的功能来满足日常开发需求。
例如,使用 for 标签可以遍历列表或查询集:
{% for item in items %}
{{ item.name }}
{% endfor %}
这段代码会依次显示 items 列表中的每个元素的 name 属性。 for 标签的 endfor 是结束标签,表明循环的结束。
内置过滤器如 length 可以获取列表长度:
{{ items|length }}
如果 items 是一个列表或查询集,这个表达式会输出其长度。
5.1.2 自定义模板标签与过滤器
为了进一步扩展Django的模板系统,开发者可以创建自定义标签和过滤器。自定义标签和过滤器可以包装复杂的逻辑,使模板代码更加简洁和易于维护。
自定义标签示例代码:
# 在你的Django应用中的templatetags目录下创建一个Python文件,例如 custom_tags.py
from django import template
from django.utils.html import format_html
register = template.Library()
@register.simple_tag
def format_price(amount):
return format_html('<span class="price">${}</span>', amount)
在模板中使用这个自定义标签:
{% load custom_tags %} <!-- 引入自定义标签库 -->
{% format_price item.price %}
这段模板代码会将 item.price 格式化为带有类名 price 的 HTML 元素。
5.2 模板继承与复用
在开发大型网站时,模板的复用是提高效率的关键。Django的模板继承机制可以让开发者定义一个基础模板,并在其他模板中覆盖需要定制的内容。
5.2.1 模板继承的机制
模板继承通过定义可扩展的区块(blocks)来实现,这些区块是子模板可以自定义的部分。
例如,创建一个基础模板 base.html :
<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}My Website{% endblock %}</title>
</head>
<body>
{% block content %}
<!-- 默认内容 -->
{% endblock %}
</body>
</html>
在其他模板中继承 base.html 并覆盖区块:
{% extends "base.html" %}
{% block title %}My Page{% endblock %}
{% block content %}
<h1>Welcome to My Page</h1>
<!-- 特定内容 -->
{% endblock %}
这里的 {% extends "base.html" %} 告诉Django这个模板继承自 base.html 。通过定义 title 和 content 区块,我们替换了基础模板中相应的部分,使得每个页面都有独特的内容,同时保留了共有的布局和结构。
5.2.2 包含模板的技巧
除了继承外,Django还提供了 include 标签,允许你在一个模板中包含另一个模板的内容。这是实现模板复用的另一种高效方式。
<!-- 在 base.html 中 -->
{% include 'header.html' %}
在 header.html 中定义的内容将被包含到 base.html 中。
5.3 动态内容生成的高级技术
Django的模板系统不仅能够展示静态内容,还可以进行动态内容的生成。高级技术如上下文处理器和模板中的自定义代码注入允许开发者在模板层面实现更复杂的逻辑。
5.3.1 上下文处理器的编写与应用
上下文处理器是一种特殊的函数,它接收一个请求对象作为参数,并返回一个字典,该字典会作为上下文传递给所有模板。这样,你就可以在所有模板中访问由上下文处理器添加的变量。
例如,编写一个上下文处理器来提供当前日期:
# 在你的Django应用中的context_processors.py文件中
from datetime import date
def add_date(request):
return {'current_date': date.today()}
在你的 settings.py 中注册这个上下文处理器:
TEMPLATES = [
{
# ...
'OPTIONS': {
'context_processors': [
# ...
'myapp.context_processors.add_date',
],
},
},
]
然后在模板中使用这个变量:
今天的日期是:{{ current_date }}
5.3.2 模板中的自定义代码注入
尽管不推荐在模板中直接编写复杂的逻辑,但在某些情况下,直接在模板中插入Python代码是必要的。Django提供了一些模板标签和过滤器,如 Cycle 和 ssi ,帮助实现这一功能。
例如,使用 ssi 标签实现服务器端包含(Server Side Includes):
<!-- 在模板中 -->
{%ssi "filename.shtml" %}
这段代码会将 filename.shtml 中的内容直接嵌入到当前模板中。
总结
在本章节中,我们详细探讨了Django模板系统的核心特性及其应用,包括模板标签和过滤器的使用、模板继承与复用的高级技巧,以及上下文处理器和模板中的代码注入等高级技术。这些知识不仅能够帮助开发者创建更加动态和灵活的Web页面,还能够通过模板的优化和复用提高开发效率。在实际开发中,合理运用这些技术可以使我们的Web应用更加健壮和易于维护。
6. Django完整项目实战
6.1 URL路由的高级配置
6.1.1 动态URL的设计
在Django项目中,动态URL设计允许我们根据用户的请求动态地匹配URL模式,并将其传递给相应的视图函数。这通常通过路径参数(path converters)实现,如 int 、 str 、 slug 等。
例如,一个博客应用可能会有一个文章详情页面,URL设计如下:
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/<str:month>/<slug:title>/', views.article_detail, name='article_detail'),
]
在这个例子中, <int:year> 、 <str:month> 和 <slug:title> 是动态的路径参数。它们将匹配任何以数字开头、字符串开头和slug格式的路径段,并将这些值传递给 article_detail 视图函数。
6.1.2 静态文件与媒体文件的配置
在Django项目开发中,静态文件(如CSS、JavaScript、图片)和媒体文件(用户上传的文件)是常见的需求。为了有效地管理这些文件,Django提供了静态文件和媒体文件的配置方法。
首先,在项目的设置文件 settings.py 中设置 STATIC_URL 和 MEDIA_URL ,分别用于静态文件和媒体文件的URL前缀:
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
接着,在项目的 urls.py 文件中添加配置,以便Django能够正确地提供这些文件:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URL configuration
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这段代码会将 MEDIA_URL 前缀的请求映射到 MEDIA_ROOT 指定的文件系统目录。
6.2 管理器的定制与使用
6.2.1 管理器的创建与注册
Django的管理器(Manager)是与数据库查询相关的类,每个Django模型至少有一个管理器实例。通过自定义管理器,我们可以修改模型的默认查询集(QuerySet)行为。
例如,我们可以在模型的内部定义一个新的管理器类:
from django.db import models
class ArticleManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(published=True)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
objects = ArticleManager()
在这个例子中, ArticleManager 管理器覆盖了 get_queryset 方法,添加了筛选条件,只返回已发布的文章。
6.2.2 管理界面的优化与扩展
Django的管理界面是通过Admin类实现的,它可以定制化管理后台的展示。例如,我们可以在 admin.py 中注册模型,并对展示进行定制:
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'published', 'date_published')
list_filter = ('published',)
search_fields = ('title',)
admin.site.register(Article, ArticleAdmin)
这段代码通过指定 list_display 、 list_filter 和 search_fields 属性,改善了文章列表页面的展示和功能,使得管理员可以更方便地进行操作。
6.3 中间件的实现与应用
6.3.1 中间件的工作原理
中间件是Django请求/响应处理流程中的钩子。在请求到达视图之前和响应返回给客户端之前的特定点,中间件可以执行操作。中间件是按照声明顺序逐个执行的。
创建一个中间件非常简单,只需要创建一个Python类,实现其中的一些方法:
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_request(self, request):
# 执行请求处理前的操作
pass
def process_response(self, request, response):
# 执行响应返回前的操作
return response
在上述中间件类中, process_request 方法会在视图函数被调用之前执行,而 process_response 方法则在视图函数执行完毕后执行。
6.3.2 开发中间件处理请求和响应
开发中间件时,我们需要在 settings.py 中注册这个中间件类,以便Django能够加载它:
MIDDLEWARE = [
# ...
'path.to.your.CustomMiddleware',
# ...
]
将我们的中间件类添加到这个列表中,就可以在中间件生命周期的不同点执行自定义代码。例如,在 process_request 中添加一个请求日志,在 process_response 中添加一个响应头:
def process_request(self, request):
print(f"Request received at {request.path}")
return None # 返回None表示继续执行,返回response则停止处理
def process_response(self, request, response):
response['X-Custom-Header'] = 'CustomValue'
return response
6.4 测试框架的搭建与执行
6.4.1 单元测试的基础知识
单元测试是检查代码中最小可测试部分(单元)是否按预期运行的过程。Django提供了强大的测试框架,它内置了单元测试库,并且紧密集成了测试数据库。
创建一个单元测试非常简单,只需要继承 TestCase 类,并编写测试方法:
from django.test import TestCase
class ArticleTestCase(TestCase):
def setUp(self):
# 每个测试开始前的初始化工作
Article.objects.create(title="Test Article", content="Content of test article")
def test_article_exists(self):
# 测试文章是否正确创建
article = Article.objects.get(title="Test Article")
self.assertIsNotNone(article)
在 setUp 方法中,我们可以在每个测试方法执行前设置初始状态。 test_article_exists 方法测试是否能够正确地从数据库中获取到文章。
6.4.2 集成测试的实战演练
集成测试是指测试多个软件组件集成在一起时的行为。在Django中,我们可以模拟客户端的请求来执行集成测试。
例如,我们可以在测试类中模拟一个GET请求:
from django.urls import reverse
class ArticleViewTestCase(TestCase):
def test_article_view(self):
# 测试文章视图是否正确返回HTTP响应
response = self.client.get(reverse('article_detail', kwargs={'year': 2021, 'month': '01', 'title': 'test-article'}))
self.assertEqual(response.status_code, 200)
在这里, reverse 函数用于动态生成URL, client.get 模拟了客户端的GET请求。我们测试响应的状态码是否为200,即请求成功。
6.5 数据库操作与用户认证的综合实践
6.5.1 使用Django ORM进行数据库操作
Django的Object-Relational Mapping (ORM) 提供了一种直观的方式来操作数据库。使用Django ORM,我们可以用Python代码执行SQL语句的功能,而无需直接编写SQL。
例如,创建、读取、更新和删除(CRUD)操作可以如下进行:
# 创建一个新文章对象
article = Article.objects.create(title="New Article", content="Content of new article")
# 读取文章对象
article = Article.objects.get(pk=1)
# 更新文章对象
article.title = "Updated Article"
article.save()
# 删除文章对象
article.delete()
这些操作都是通过Django模型和管理器(Manager)提供的方法来完成的。
6.5.2 用户认证系统的设计与实现
Django内置了一个用户认证系统,它提供了用户模型、用户组以及密码管理等认证相关的功能。通过Django认证系统,我们能方便地实现用户注册、登录和注销等功能。
例如,创建一个用户并进行登录认证:
from django.contrib.auth.models import User
# 创建用户
User.objects.create_user(username='testuser', email='test@example.com', password='test1234')
# 认证用户
from django.contrib.auth import authenticate
user = authenticate(username='testuser', password='test1234')
if user is not None:
# 登录成功
pass
在这个例子中, create_user 方法用于创建一个新用户,而 authenticate 函数用于验证用户输入的用户名和密码是否匹配。
通过上述内容,我们可以看到Django项目实战中URL路由、管理器、中间件、测试框架、数据库操作和用户认证等关键组件的应用与实现。掌握这些高级配置和应用技巧,对于高效开发和优化Django项目至关重要。
简介:《Django书籍随书源代码》提供了一系列Python Django框架项目和示例代码,供开发者深入学习。Django框架支持快速开发和“DRY”设计原则,其核心包括模型、视图、模板和URL路由等组件。zip文件中的 djangoweb 文件夹展示了这些核心组件的具体实现,包括数据结构的模型定义、视图处理逻辑、模板内容生成以及URL配置。此外,还涉及管理员界面、中间件、配置设置和测试等方面,是提升Django开发技能的宝贵资料。
更多推荐

所有评论(0)