django从入门到实战(二)——FBV视图介绍

server/2024/11/20 10:14:59/

在 Django 中,视图是处理 HTTP 请求并返回 HTTP 响应的核心部分。Django 提供了两种主要的视图实现方式:FBV(Function-Based View)和 CBV(Class-Based View)。下面将详细介绍这两种视图的语法、要义和使用方法。

1. FBV(Function-Based View)

1.1 定义与要义

FBV 是使用普通的 Python 函数来定义视图。它是 Django 中最基本的视图类型,适合处理简单的请求和响应逻辑。FBV 的优点在于其简单性和直接性,易于理解和使用。

1.2 语法

FBV 的基本语法如下:

from django.http import HttpResponse
from django.shortcuts import renderdef my_view(request):# 处理请求逻辑if request.method == 'GET':# 处理 GET 请求return HttpResponse("Hello, World!")elif request.method == 'POST':# 处理 POST 请求return HttpResponse("Data submitted!")

1.3 使用方法

  1. 定义视图

    views.py 文件中定义视图函数。

    # myapp/views.py
    from django.http import HttpResponse
    from django.shortcuts import renderdef home(request):return render(request, 'home.html')  # 渲染首页模板def about(request):return HttpResponse("关于我们")  # 返回简单的文本响应
    
  2. 配置 URL

    urls.py 文件中配置 URL 路由。

    # myapp/urls.py
    from django.urls import path
    from . import viewsurlpatterns = [path('', views.home, name='home'),  # 首页path('about/', views.about, name='about'),  # 关于页面
    ]
    
  3. 创建模板(例如 home.html):

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>欢迎来到我的博客</h1><a href="{% url 'about' %}">关于我们</a>
    </body>
    </html>
    

1.4 优缺点

  • 优点

    • 简单易懂,适合初学者。
    • 灵活性高,可以自由编写逻辑。
  • 缺点

    • 随着应用复杂度增加,FBV 可能导致代码重复和难以维护。
    • 不支持面向对象的设计模式。

2. CBV(Class-Based View)

2.1 定义与要义

CBV 是使用 Python 类来定义视图。它提供了一种更结构化的方式来处理请求和响应,支持面向对象的编程风格。CBV 通过继承和方法重写来实现视图逻辑的复用和扩展。

2.2 语法

CBV 的基本语法如下:

from django.views import View
from django.http import HttpResponseclass MyView(View):def get(self, request):return HttpResponse("Hello, World!")def post(self, request):return HttpResponse("Data submitted!")

2.3 使用方法

  1. 定义视图

    views.py 文件中定义视图类。

    # myapp/views.py
    from django.views import View
    from django.shortcuts import render
    from django.http import HttpResponseclass HomeView(View):def get(self, request):return render(request, 'home.html')  # 渲染首页模板class AboutView(View):def get(self, request):return HttpResponse("关于我们")  # 返回简单的文本响应
    
  2. 配置 URL

    urls.py 文件中配置 URL 路由。

    # myapp/urls.py
    from django.urls import path
    from .views import HomeView, AboutViewurlpatterns = [path('', HomeView.as_view(), name='home'),  # 首页path('about/', AboutView.as_view(), name='about'),  # 关于页面
    ]
    
  3. 创建模板(例如 home.html):

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>首页</title>
    </head>
    <body><h1>欢迎来到我的博客</h1><a href="{% url 'about' %}">关于我们</a>
    </body>
    </html>
    

2.4 优缺点

  • 优点

    • 支持面向对象的编程,便于代码复用和扩展。
    • 可以通过继承和混入(Mixin)来组合不同的功能。
    • 提供了许多内置的通用视图(如 ListViewDetailView 等),可以快速实现常见功能。
  • 缺点

    • 对于简单的视图,CBV 可能显得过于复杂。
    • 学习曲线相对较陡,特别是对于初学者。

FBV 和 CBV 各有优缺点,选择使用哪种视图取决于具体的应用需求和开发者的偏好。对于简单的应用,FBV 可能更合适;而对于复杂的应用,CBV 提供了更好的结构和复用性。了解这两种视图的特点和使用方法,可以帮助开发者在 Django 项目中做出更合适的选择。

3:设置响应方式

在 Django 中,响应是视图处理请求后返回给客户端的内容。Django 提供了多种响应类型,以满足不同的需求。以下是关于如何设置响应方式、响应类型、异常响应以及文件下载的详细介绍。

1. 响应类型

Django 提供了多种响应类型,最常用的包括:

  • HttpResponse:最基本的响应类型,用于返回简单的文本或 HTML 内容。
  • JsonResponse:用于返回 JSON 格式的数据,适合 API 开发。
  • HttpResponseRedirect:用于重定向到另一个 URL。
  • FileResponse:用于返回文件下载。
  • StreamingHttpResponse:用于流式响应,适合大文件下载或实时数据流。
1.1 使用 HttpResponse
from django.http import HttpResponsedef my_view(request):return HttpResponse("Hello, World!")  # 返回简单的文本响应
1.2 使用 JsonResponse
from django.http import JsonResponsedef my_view(request):data = {'key': 'value'}return JsonResponse(data)  # 返回 JSON 格式的数据
1.3 使用 HttpResponseRedirect
from django.http import HttpResponseRedirectdef my_view(request):return HttpResponseRedirect('/another-url/')  # 重定向到另一个 URL
1.4 使用 FileResponse
from django.http import FileResponsedef download_file(request):file_path = 'path/to/your/file.txt'response = FileResponse(open(file_path, 'rb'))response['Content-Disposition'] = 'attachment; filename="file.txt"'  # 设置下载文件名return response
1.5 使用 StreamingHttpResponse
from django.http import StreamingHttpResponsedef stream_large_file(request):def file_iterator(file_name, chunk_size=512):with open(file_name, 'rb') as f:while True:chunk = f.read(chunk_size)if not chunk:breakyield chunkresponse = StreamingHttpResponse(file_iterator('large_file.txt'))response['Content-Type'] = 'text/plain'return response

2. 异常响应

在 Django 中,可以使用 HttpResponseJsonResponse 来返回异常响应。通常情况下,使用 HTTP 状态码来指示错误类型。

2.1 返回 404 错误
from django.http import HttpResponseNotFounddef my_view(request):return HttpResponseNotFound("页面未找到")  # 返回 404 锁定响应
2.2 返回 500 错误
from django.http import HttpResponseServerErrordef my_view(request):return HttpResponseServerError("服务器内部错误")  # 返回 500 锁定响应

3. Django 的文件下载

Django 提供了 FileResponse 类来处理文件下载。可以通过设置 Content-Disposition 响应头来指定文件下载的名称。

文件下载示例
from django.http import FileResponsedef download_file(request):file_path = 'path/to/your/file.txt'response = FileResponse(open(file_path, 'rb'))response['Content-Disposition'] = 'attachment; filename="file.txt"'  # 设置下载文件名return response

4:HTTP 请求对象

在 Django 中,HTTP 请求对象包含了客户端发送的所有请求信息。可以通过 request 参数在视图中访问请求对象。

1. 请求方式类型

Django 支持多种 HTTP 请求方式,主要包括:

  • GET:用于请求数据,通常用于获取资源。
  • POST:用于提交数据,通常用于创建或更新资源。
  • PUT:用于更新资源(不常用,通常在 RESTful API 中使用)。
  • DELETE:用于删除资源(不常用,通常在 RESTful API 中使用)。
  • PATCH:用于部分更新资源(不常用,通常在 RESTful API 中使用)。

2. 获取请求信息

可以通过 request 对象获取请求的各种信息:

  • 请求方法request.method 获取请求方法(如 GET、POST)。
  • 请求路径request.path 获取请求的 URL 路径。
  • 查询参数request.GET 获取 GET 请求的查询参数。
  • 表单数据request.POST 获取 POST 请求的表单数据。
  • 文件数据request.FILES 获取上传的文件。
示例
from django.http import JsonResponsedef my_view(request):if request.method == 'GET':# 获取查询参数param = request.GET.get('param', 'default_value')return JsonResponse({'param': param})elif request.method == 'POST':# 获取表单数据data = request.POST.get('data', 'default_data')return JsonResponse({'data': data})

3. 文件上传实现

在 Django 中,可以通过 request.FILES 获取上传的文件。通常需要在 HTML 表单中设置 enctype="multipart/form-data"

示例
  1. HTML 表单
<form method="post" enctype="multipart/form-data">{% csrf_token %}<input type="file" name="myfile"><button type="submit">上传</button>
</form>
  1. 视图处理文件上传
from django.http import JsonResponsedef upload_file(request):if request.method == 'POST':uploaded_file = request.FILES['myfile']# 处理文件(保存、读取等)with open('path/to/save/' + uploaded_file.name, 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return JsonResponse({'message': '文件上传成功'})

http://www.ppmy.cn/server/143449.html

相关文章

LLM学习笔记(2)会话补全Chat Completions、什么是JSON?

什么是会话补全Chat Completions&#xff1f; 功能目标&#xff1a;处理多轮对话。 它模拟对话的逻辑&#xff0c;比如聊天机器人对用户消息的回应。使用的模型主要是针对对话型应用优化的模型&#xff0c;例如gpt-3.5-turbo或gpt-4。 什么是JSON&#xff1f; JSON 本质上是…

环形缓冲区 之 STM32 串口接收的实现

STM32串口数据接收环形缓冲区接收实例说明 ...... 矜辰所致前言 关于环形缓冲区&#xff0c;网上有大量的理论说明文章&#xff0c;在有些操作系统中&#xff0c;会有实现环形缓冲区的代码&#xff0c;比如 RT-Thread 的 ringbuffer.c 和 ringbuffer.h 文件&#xff0c;Li…

sei节点快速搭建方法

文章目录 一、环境准备1.1 基础环境准备1.2 golang环境准备二、启动节点2.1 执行节点启动脚本2.2 启动节点三、 其它信息3.1 默认服务端口3.2 节点本地rpc接口使用Sei主网节点搭建之前,大概说明一下本次使用的服务器配置 服务器环境云厂商:AWS 节点地区:香港 CPU:16核 内存…

【概率论】概率密度到底是什么

1. 书本上的定义&#xff1a; 如果对于随机变量X的分布函数F(X)&#xff0c;存在一个非负可积函数f(x)&#xff0c;使得任意实数x&#xff0c;都有&#xff1a; 称X为连续型随机变量&#xff0c;函数f(x)称为X的概率密度 所谓的概率密度&#xff0c;就是 概率/区间长度 &#…

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之&#xff1a;Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…

Bug的严重等级和优先级别与分类

目录 前言 1. Bug的严重等级定义 2.Bug的优先等级 3.一般 BUG 的正规的处理流程 4.BUG严重等级划分 5.BUG紧急程度定义 前言 Bug是指在软件开发或者系统运行过程中出现的错误、缺陷或者异常情况。它可能导致系统无法正常工作、功能不完整、数据错误或者界面异常等问题。 …

Axios交互

一、什么是交互&#xff1f; 交互就是交流互动 根据人的输入&#xff0c;让程序或应用去根据输入选择执行流程&#xff0c;提供给我们需要的信息 1. 前端与后端 任何一个应用程序都有前端和后端 前端&#xff1a;客户端&#xff0c;就是浏览器 控制页面的样式 数据的展示 …

计算机网络(12)介质访问控制

ok通过前面的学习我们已经知道数据链路层提供的服务有帧封装&#xff0c;物理地址&#xff0c;流量控制&#xff0c;错误控制&#xff0c;访问控制。今天就来记录最后的访问控制。 介质访问控制 (MAC)详解 介质访问控制&#xff08;Media Access Control&#xff0c;简称 MAC&…