类视图(Class-Based Views)是 Django 中用于处理 HTTP 请求和生成 HTTP 响应的一种方式,它们基于 Python 类来定义视图逻辑。
相对于基于函数的视图,类视图提供了更结构化、可维护和可扩展的方式来编写 Web 应用程序的视图逻辑。
类视图是 Python 类,通常继承自 Django 的通用视图类,如 View 、TemplateView、ListView、DetailView 等。每个类视图通常包括一个或多个方法,每个方法对应于不同的HTTP请求方法(如 GET、POST 等)。
Django 提供了一些常见的类视图基类,它们可以用作基础类,以便快速创建常见的视图。以下是一些常见的类视图基类:
# Project 项目中的 urls.py
from django.urls import path,include # 导入 Django 的 path 函数,用于配置 URL 路由,include 函数,用于将其它 URL 模式包含在当前 URL 配置中
# URL 配置列表,定义了网站的所有 URL 路径和对应的处理程序
urlpatterns = [
# 配置 URL 路由
path('', include('users.urls'))
]
# users 子应用的 urls.py
from django.urls import path # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数
# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
# 使用 path 函数将'/register/'路径映射到 RegisterView 类视图
path('register/',views.RegisterView.as_view()),
]
# 子应用的 views.py
from django.views import View # 导入 View 类,用于创建类视图
from django.shortcuts import render # 导入 render 函数,用于渲染模板
from django.http import HttpResponse # 导入 HttpResponse 类,用于创建 HTTP 响应
class RegisterView(View):
# 处理 GET 请求,显示用户注册页面
def get(self, request):
# 使用 render 函数渲染并返回 register.html 模板
return render(request, 'register.html')
# 处理 POST 请求,接收并处理用户提交的注册信息
def post(self, request):
# 打印 request 对象,可选,用于调试和查看请求信息
print(request)
# 从 POST 请求中获取用户提交的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 打印用户名和密码,可选,用于调试和查看用户提交的数据
print(username)
print(password)
# 在这里处理用户提交的注册信息,例如将信息保存到数据库
# 返回一个简单的HTTP响应,表示注册成功
return HttpResponse('注册成功')
在根目录下创建 templates 文件夹。
# setting.py
# 设置模板引擎配置,包括模板目录、模板上下文处理器等。
TEMPLATES = [
{
# Django 模板引擎的配置项
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 额外的模板目录,留空表示使用默认的模板目录
'DIRS': [BASE_DIR / 'templates'],
# 表示启用应用程序模板目录
'APP_DIRS': True,
# Django 模板引擎配置的一部分,用于指定模板上下文处理器(context processors)的选项
'OPTIONS': {
# 一个列表,用于指定要应用的模板上下文处理器。
'context_processors': [
# Django 自带的模板上下文处理器
'django.template.context_processors.debug',
# Django 自带的模板上下文处理器
'django.template.context_processors.request',
# Django 自带的模板上下文处理器
'django.contrib.auth.context_processors.auth',
# Django 自带的模板上下文处理器
'django.contrib.messages.context_processors.messages',
],
},
},
]
在 templates 文件夹下,新建 register.html 文件并编写。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="#" method="post">
username: <input type="text" id="username" name="username"><br>
password: <input type="password" id="password" name="password" ><br>
register: <button type="submit">注册button>
form>
body>
html>
用于在请求和响应处理过程中执行预定义的操作。
中间件可以在 HTTP 请求到达视图之前和响应返回给客户端之前执行各种任务,例如身份验证、日志记录、性能优化、安全性检查等。
请求阶段
视图处理
响应阶段
请求是从上往下,响应是从下往上。
1、在子应用中创建自定义中间件文件 middlewarse.py。
# users 子应用的 middlewarse.py
from django.http import HttpResponse # 导入 HttpResponse 类,用于创建自定义 HTTP 响应对象
from django.utils.deprecation import MiddlewareMixin # 导入 MiddlewareMixin 类,它是编写中间件的基类,用于方便地定义中间件类
# 定义中间件类 MD1,继承自 MiddlewareMixin
class MD1(MiddlewareMixin):
# 在请求处理之前执行的方法
def process_request(self, request):
print("md1 process_request 方法", id(request))
# 在响应返回客户端之前执行的方法
def process_response(self, request, response):
print("md1 process_response 方法", id(request))
# 返回响应对象,可以对响应进行修改或不做修改
return response
# 在视图函数被调用之前执行的方法
def process_view(self, request, view_func, view_args, view_kwargs):
print("md1 process_view 方法")
# 调用视图函数并传递请求对象
return view_func(request)
# 在视图函数抛出异常时执行的方法
def process_exception(self, request, exception):
print("md1 process_exception 方法")
# 返回一个带有异常信息的 HTTP 响应对象
return HttpResponse(exception)
# 定义中间件类 MD2,继承自 MiddlewareMixin
class MD2(MiddlewareMixin):
# 在请求处理之前执行的方法
def process_request(self, request):
print("md2 process_request 方法", id(request))
# 在响应返回客户端之前执行的方法
def process_response(self, request, response):
print("md2 process_response 方法", id(request))
# 返回响应对象,可以对响应进行修改或不做修改
return response
# 在视图函数被调用之前执行的方法
def process_view(self, request, view_func, view_args, view_kwargs):
print("md2 process_view 方法")
# 调用视图函数并传递请求对象
return view_func(request)
# 在视图函数抛出异常时执行的方法
def process_exception(self, request, exception):
print("md2 process_exception 方法")
# 返回一个带有异常信息的 HTTP 响应对象
return HttpResponse(exception)
# 运行结果:
# md1 process_request 方法 140083017419800
# md2 process_request 方法 140083017419800
# md2 process_response 方法 140083017419800
# md1 process_response 方法 140083017419800
2、在 settings.py 中的中间件的位置加入以下代码。
# settings.py
# 中间件
MIDDLEWARE = [
# 导入自定义的中间件类
'users.middlewarse.MD1',
'users.middlewarse.MD2',
]
做 IP 访问频率限制
# users 子应用的 middlewarse.py
import time # 导入 time 模块,用于计算时间间隔、获取当前时间等操作
from django.utils.deprecation import MiddlewareMixin # 导入 MiddlewareMixin 类,它是编写中间件的基类,用于方便地定义中间件类
from django.http import HttpResponse # 导入 HttpResponse 类,用于创建自定义 HTTP 响应对象
# 创建一些变量和设置
white = ['127.0.0.1'] # 白名单
black = ['127.0.0.2'] # 黑名单
ban = {} # 小黑屋
ban_seconds = 3 # 三秒内
ban_limit = 5 # 三秒内允许访问5次
ban_time = 30 # 被封时间30秒
# 定义中间件类 AuthMD,继承自 MiddlewareMixin
class AuthMD(MiddlewareMixin):
# 在每个请求处理之前执行的方法
def process_request(self, request):
ip = str(request.META.get("REMOTE_ADDR")) # 获取请求的 IP 地址
if ip in black:
return HttpResponse('禁止访问', status=403) # 如果 IP 在黑名单中,返回 403 状态码
# 如果是第一次请求
if not ban.get(ip):
ban[ip] = {"total": 1, "time": int(time.time()), "banTime": ""} # 如果 IP 不在小黑屋中,初始化相关信息
print(ip, ban[ip].get("total")) # 打印 IP 和访问次数
# 如果不是第一次请求,则判断上次请求和这次请求是否在合法时间内
if ban[ip]["time"] + ban_seconds > int(time.time()):
# 如果是三秒内,判断访问次数
if ban[ip]["total"] > ban_limit:
ban[ip]["banTime"] = int(time.time()) + ban_time # 如果在封禁时间内访问次数超过限制,设置封禁时间
return self.ban_response() # 返回封禁响应
ban[ip]["total"] += 1 # 如果没有大于限制次数
print(ban) # 增加访问次数,并打印小黑屋信息
# 如果不是在合法时间内请求
else:
limit_time = ban[ip]["banTime"] # 先根据此 IP 找封的时间
if limit_time and limit_time > int(time.time()):
return self.ban_response() # 如果在封禁时间内,返回封禁响应
del ban[ip] # 否则从小黑屋中移除 IP 地址
# 定义封禁响应方法
def ban_response(self):
return HttpResponse(f"访问过于频繁,请{ban_time}秒后重试!")
# 在每个响应返回客户端之前执行的方法
def process_response(self, request, response):
return response # 返回原始响应对象,不做修改
# settings.py
# 中间件
MIDDLEWARE = [
# 导入自定义的中间件类
'users.middlewarse.AuthMD',
]
记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~