Django视图详解
前言
欢迎来到我的博客
个人主页:北岭敲键盘的荒漠猫-CSDN博客
一、Django视图是什么?
视图(View) 是Django处理HTTP请求的核心组件。它接收一个HttpRequest
对象,处理业务逻辑,并返回一个HttpResponse
对象(如网页、JSON数据、重定向等)。
1. 视图的两种写法
-
函数视图(FBV,Function-Based Views) :用Python函数实现。
from django.http import HttpResponsedef hello(request):return HttpResponse("Hello World!")
-
类视图(CBV,Class-Based Views) :用类的方法处理请求(更结构化,适合复用)。
from django.views import View from django.http import HttpResponseclass HelloView(View):def get(self, request):return HttpResponse("GET请求示例")def post(self, request):return HttpResponse("POST请求示例")
二、编写第一个视图:详细步骤
1. 创建视图函数
在views.py
中定义一个处理请求的函数:
# myapp/views.py
from django.http import HttpResponsedef home_page(request):return HttpResponse("<h1>欢迎来到我的网站!</h1>")
2. 配置URL路由
在urls.py
中将URL路径映射到视图:
# myproject/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('', views.home_page, name='home'), # 根路径指向home_page视图
]
3. 运行开发服务器
python manage.py runserver
访问 [http://127.0.0.1:8000](http://127.0.0.1:8000)
即可看到页面。
三、深入理解请求(HttpRequest)和响应(HttpResponse)
1. HttpRequest对象:包含请求的所有信息
-
常用属性:
request.method
:请求方法(GET、POST等)request.GET
:GET请求的参数(字典形式)request.POST
:POST请求的表单数据request.FILES
:上传的文件request.user
:当前登录用户(需启用认证中间件)
-
示例:处理GET请求参数
def greet(request):name = request.GET.get('name', '游客') # 获取name参数,默认值'游客'return HttpResponse(f"你好,{name}!")
2. HttpResponse对象:返回内容给浏览器
-
常见用法:
- 返回文本:
HttpResponse("文本内容")
- 返回HTML:
HttpResponse("<h1>标题</h1>")
- 返回JSON:
JsonResponse({'data': 'xxx'})
- 重定向:
HttpResponseRedirect('/new-url/')
- 返回文本:
-
示例:返回JSON数据
from django.http import JsonResponsedef json_example(request):data = {'status': 'success', 'message': '请求成功'}return JsonResponse(data)
四、函数视图(FBV)的完整流程
1. 处理GET和POST请求
def contact(request):if request.method == 'POST':# 处理表单提交name = request.POST.get('name')email = request.POST.get('email')print(f"收到来自{name} ({email}) 的消息")return HttpResponseRedirect('/thanks/') # 重定向到感谢页面else:# 显示空表单return render(request, 'contact.html')
2. 渲染模板(Template)
使用render()
函数将数据传递到HTML模板:
from django.shortcuts import renderdef article_list(request):articles = Article.objects.all() # 假设Article是模型return render(request, 'articles/list.html', {'articles': articles})
模板文件 articles/list.html
:
{% for article in articles %}<h2>{{ article.title }}</h2><p>{{ article.content }}</p>
{% endfor %}
五、类视图(CBV)的用法详解
1. 基本结构
from django.views import View
from django.http import HttpResponseclass MyView(View):def get(self, request):# 处理GET请求return HttpResponse("GET请求")def post(self, request):# 处理POST请求return HttpResponse("POST请求")
2. 在URL中使用类视图
# urls.py
urlpatterns = [path('myview/', MyView.as_view(), name='my-view'),
]
3. 类视图的优势:复用与扩展
- 继承内置通用视图(如
ListView
,DetailView
) - 重写方法自定义行为:
class ArticleListView(ListView):model = Article # 关联模型template_name = 'articles/list.html' # 指定模板context_object_name = 'article_list' # 模板中使用的变量名def get_queryset(self):# 过滤已发布的文章return Article.objects.filter(status='published')
六、通用视图(Generic Views)快速入门
Django内置了处理常见场景的类视图,极大简化代码。
概念:
通用视图(Generic Views)是Django为解决Web开发中重复模式设计的"快捷工具包",它能让你用极简代码实现以下常见功能:
- 显示对象列表(如商品列表、文章列表)
- 展示单个对象详情(如用户详情页)
- 处理表单创建/修改对象(如新建订单)
- 日期归档页面(如按月份展示文章)
- 删除对象前的确认操作
传统函数视图需要手动处理数据库查询、模板渲染等细节,而通用视图通过"约定优于配置"原则自动完成这些基础工作
1. ListView:显示对象列表
from django.views.generic import ListViewclass BookListView(ListView):model = Book # 自动获取所有Book对象template_name = 'books/book_list.html' # 默认模板:books/book_list.htmlcontext_object_name = 'books' # 模板中变量名(默认object_list)
2. DetailView:显示单个对象详情
from django.views.generic import DetailViewclass BookDetailView(DetailView):model = Book# 默认模板:books/book_detail.html# 通过URL中的pk或slug获取对象(如 /books/1/)
3. 表单处理:CreateView/UpdateView
from django.views.generic.edit import CreateView
from django.urls import reverse_lazyclass BookCreateView(CreateView):model = Bookfields = ['title', 'author', 'price'] # 表单字段template_name = 'books/book_form.html'success_url = reverse_lazy('book-list') # 提交成功后跳转的URL
七、实际场景案例
1. 用户登录视图
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirectdef login_view(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)return redirect('home')else:return render(request, 'login.html', {'error': '用户名或密码错误'})return render(request, 'login.html')
2. 文件上传
def upload_file(request):if request.method == 'POST' and request.FILES['file']:uploaded_file = request.FILES['file']# 保存文件到服务器with open(f'uploads/{uploaded_file.name}', 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return HttpResponse("文件上传成功!")return render(request, 'upload.html')
八、常见问题与调试技巧
1. 404错误处理
- 使用
get_object_or_404
替代get
:from django.shortcuts import get_object_or_404def book_detail(request, pk):book = get_object_or_404(Book, pk=pk)return render(request, 'books/detail.html', {'book': book})
2. 调试视图
- 打印请求信息:
def debug_view(request):print("请求方法:", request.method)print("GET参数:", request.GET)print("用户:", request.user)return HttpResponse("查看控制台输出")
3. 单元测试
from django.test import TestCase, Clientclass ViewTests(TestCase):def test_home_page(self):client = Client()response = client.get('/')self.assertEqual(response.status_code, 200)self.assertContains(response, "欢迎")
九、最佳实践总结
-
选择合适的视图类型:
- 简单逻辑用函数视图(FBV)
- 复杂或重复逻辑用类视图(CBV)
-
保持视图简洁:
- 业务逻辑抽离到单独模块(如
utils.py
) - 使用通用视图减少重复代码
- 业务逻辑抽离到单独模块(如
-
安全注意事项:
- 始终验证用户输入
- 使用
@login_required
限制敏感操作 - 启用CSRF保护(表单中加
{% csrf_token %}
)
-
性能优化:
- 使用
select_related
和prefetch_related
优化数据库查询 - 缓存频繁访问的视图(如使用
@cache_page
装饰器)
- 使用
相关文章:
Django视图详解
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 一、Django视图是什么? 视图(View) 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象,处理业务逻辑,并返回一个HttpResponse对象(…...
【区块链+ 人才服务】北京师范大学区块链底层链平台 | FISCO BCOS 应用案例
北京师范大学是教育部直属重点大学,2018 年 6 月,北京师范大学成立知识区块链研究中心,致力于区块链基础技术及其在教育领域的应用研究。 2020 年6 月18 日, 北京市人民政府办公厅发布《北京市区块链创新发展行 动计划(2020—202…...
java设计模式-模板方法模式
模板方法模式 编写制作豆浆的程序,说明如下 1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4)请使用模板方法模式完成 说明…...
同步通信、异步通信、并行传输和串行传输
同步通信、异步通信、并行传输和串行传输是通信与数据传输领域的关键概念,它们既相互关联又有本质区别。以下是详细解释和对比: 1. 核心概念分类 通信方式:描述数据传输的时序和协调规则。 同步通信(Synchronous Communi…...
JVM生产环境调优实战
案例三:JVM频繁Full GC优化 1. 项目背景(Situation) 在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000&a…...
Python: sqlite3.OperationalError: no such table: ***解析
出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案: 步骤 1:创建数据库表 在插入数据前,必须先执行建表语句。请通过以下任一方式创建表: 方式一:使用 SQLite 命令行 bash 复制 # 进入 SQLit…...
JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道
"此刻正是奇点编译的第3.1415926秒!伏羲的算筹正在撕裂冯诺依曼架构的次元壁!诸君请看——这JVM堆内存中正在孕育盘古的元神!" 目录(终极扩展) 第一章:太极二进——内存模型的阴阳交缠 第二章&a…...
Python 字典和集合(字典推导)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典推导 自 Python 2.7 …...
【AI】prompt engineering
prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…...
小刚说C语言刷题——第18讲 循环之while和do-while语句
昨天我们讲了循环语句中的for语句,它主要用于循环次数已知的情况,但是对应循环次数未知的情况,我们又怎么办?这就要用到while和do-while语句了。 1.while语句 (1)语法格式 while(条件表达式) { 循环体; } (2)执行过程 当执…...
[Mysql]buffersize修改
1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld...
自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
自定义数据结构放入QVariant,在序列化时抛出异常 ASSERT failure in QVariant::save: “invalid type to save” 自定义数据结构如struct MyData,除了要在结构体后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的输入输出&…...
带约束的智能优化算法
带约束的智能优化算法 约束条件和优化问题(可改)粒子群算法麻雀搜索算法鲸鱼优化算法灰狼优化算法免疫优化算法人工蜂群算法沙猫群算法萤火虫算法资源 约束条件和优化问题(可改) 粒子群算法 麻雀搜索算法 鲸鱼优化算法 灰狼优化算法 免疫优化算法 人工蜂群算法 沙猫群算法 萤火…...
【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析
🌟【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析🌟 📜 前言:当传统棋艺遇上人工智能 五子棋作为中国传统棋类游戏,规则简单却变化无穷。本文将带你用纯前端技术实现一个具备AI对战功能…...
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南 本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。 目录 前提条件参考文档…...
华为OD全流程解析+备考攻略+经验分享
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
数据库中的数组: MySQL与StarRocks的数组操作解析
在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…...
Qt 交叉编译详细配置指南
一、Qt 交叉编译详细配置 1. 准备工作 1.1 安装交叉编译工具链 # 例如安装ARM工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 准备目标…...
【详细图文】在VScode中配置python开发环境
目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode (1)已自动下载汉化版插件 (2)未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python (1)双击打开…...
strings.Fields 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:解析服务器日志 示例3:清理用户输入 8. 性能比较 性能特点 对比表…...
PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
步骤 1.全套证书已经生成。OK 2.找国芯要ECC加密解密签名验签代码。给的逻辑说明没有示例代码很难的上。 3.集成到工具 与SP联调。 1.用openssl全套证书生成及验证 注意:这里CA 签发 KLD 证书用的是SHA256。因为芯片只支持SHA256算法,不支持SHA512。改成统一。…...
微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
微软 SC-900 认证介绍 SC-900 认证考试是微软推出的一项基础级别认证,全称为 Microsoft Certified: Security, Compliance, and Identity Fundamentals。该认证旨在验证考生对微软云服务(如 Azure 和 Microsoft 365)中的安全、合规和身份管理…...
Uniapp 集成极光推送(JPush)完整指南
文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一:使用UniPush(推荐)方法二:手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…...
OpenCV图像平滑处理方法详解
文章目录 引言一、什么是图像平滑?二、常见的图像平滑方法1.先对图片加上噪声点2. 均值滤波(Averaging)3. 方框滤波(boxFilter)4. 中值滤波(Median Blur)5. 高斯滤波(Gaussian Blur&…...
Lua 中,`math.random` 的详细用法
在 Lua 中,math.random 是用于生成伪随机数的核心函数。以下是其详细用法、注意事项及常见问题的解决方案: Lua 中,math.random 的详细用法—目录 一、基础用法1. 生成随机浮点数(0 ≤ x < 1)2. 生成指定范围的随机…...
使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
目录 一.方法一(没成功) 1.运行PX4 2.运行mavros通讯 3.启动仿真世界和无人机 (1)单独测试相机 (2)make px4_sitl gazebo启动四旋翼iris无人机 二.方法二(成功) 1.通过 rosl…...
ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件
该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 文章目录 Permake5为什么使用 Premake? 项目实战总结一下:详细代码: Permake5 Premake5 是一个跨平台的构建配置工具,它允许开发者通过使用一个简单的脚…...
equals() 和 hashCode()
作为 Java 开发者,我们经常会用到 equals() 和 hashCode() 这两个方法。 它们是 Object 类中定义的基础方法,看似简单,但如果理解不透彻,很容易在实际开发中踩坑。 本文将深入探讨这两个方法的作用、区别、以及如何正确地重写它们…...
臭氧除菌柜市场报告:2031年全球臭氧除菌柜市场销售额预计将达到9.4亿元
一、市场概述 (一)定义与分类 臭氧除菌柜,作为新一代绿色消毒设备,主要利用臭氧(O₃)的强氧化性来实现无化学残留的消毒净化。根据产品类型,可分为单门型和双门型。单门型设计紧凑,…...
解决python manage.py shell ModuleNotFoundError: No module named xxx
报错如下: python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…...
通用接口函数注册模块设计与实现
文章目录 通用接口函数注册模块设计与实现1. 模块概述2. 核心功能2.1 数据结构函数注册项结构体注册函数宏 2.2 核心函数实现函数:sl_register_interface_functions 3. 使用示例3.1 基础使用示例 - 设备驱动接口定义接口结构体实现具体函数创建注册表注册接口 3.2 高…...
C,C++,C#
C、C 和 C# 是三种不同的编程语言,虽然它们名称相似,但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别: 1. 设计目标和历史 语言诞生时间设计目标特点C1972(贝尔实验室)面向过程&#…...
scala-集合3
集合计算高级函数 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 (筛选出满足条件的元素组成新集合。) 转换或映射(map):将原始集合中的元素映射到某个函数。 扁平化:取消…...
Spring MVC 重定向(Redirect)详解
Spring MVC 重定向(Redirect)详解 1. 核心概念与作用 重定向(Redirect) 是 Spring MVC 中一种客户端重定向机制,通过 HTTP 302 状态码(默认)将用户浏览器重定向到指定 URL。 主要用途…...
Scala的集合(二)
1. 集合计算高集函数 任务要求 1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 2)转化/映射(map):将集合中的每一个元素映射到某一个函数 3)扁平化 4)扁平化映射 注:flatMap 相当于先进行 map 操作&#…...
GZ036区块链卷三 EtherGame合约漏洞详解
题目 pragma solidity ^0.8.3; contract EtherGame {uint public targetAmount 7 ether;address public winner;function deposit() public payable {require(msg.value 1 ether, "You can only send 1 Ether");uint balance address(this).balance;require(bala…...
BGP路由协议之路由通告/传递
BGP 的路由宣告 BGP 自身并不会发现并计算产生路由,只会将 IGP 路由表中的路由引入到 BGP 路由表中,并通过 Update 报文传递给 BGP 对等体(邻居) Network 宣告,前提是路由表中存在该条路由 import-route 引…...
Python合并多个pdf
场景: 现在要解决批量合并PDF的问题。 有很多PDF文件需要合并成一个,比如报告、发票或者多个章节的文档。 对于Windows用户,Adobe Acrobat是专业的选择,但需要付费。但是我不想花钱,所以推荐免费软件,比…...
聊一聊接口测试时遇到上下游依赖时该如何测试
目录 一、手工测试时的处理方法 1.1沟通协调法 1.2模拟数据法 二、自动化测试时的处理方法 2.1 数据关联法(变量提取) 2.2 Mock数据法 2.3自动化框架中的依赖管理 三、实施示例(以订单接口测试为例) 3.1Mock依赖接口&…...
pdf转latex
Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…...
剖析 Docker Swarm 操作对原有容器端口影响
剖析 Docker Swarm 操作对容器端口影响 一、背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况。期间涉及 docker swarm init --advertise-addr172.16.10.110 以及 docker swarm join…...
QML面试笔记--UI设计篇02布局控件
1. QML 中常用的布局控件 1.1. Row1.2. Column1.3. Grid1.4. RowLayout1.5. ColumnLayout1.6. GridLayout1.7. 总结 1. QML 中常用的布局控件 1.1. Row 背景知识:Row 布局用于将子元素水平排列,适合简单的线性布局,如工具栏按钮或表单输入…...
Java全栈项目--校园快递管理与配送系统(4)
源代码续 /*** 通知工具类*/// 通知类型常量 export const NotificationType {SYSTEM: 1,EXPRESS: 2,ACTIVITY: 3 }// 通知类型名称映射 export const NotificationTypeNames {[NotificationType.SYSTEM]: 系统通知,[NotificationType.EXPRESS]: 快递通知,[NotificationType…...
c语言练习一
1、统计二进制数中1的个数 #include <stdio.h>int main(void) {int count 0; //统计1出现次数 int x 0b1011;while(x){count ;//x 0b1011 > x-1 0b1010 x-1,将x从右往左数遇到第一个1变成0,左边全部变为1,右边不变 //x&x-1 1010 …...
Scala安装
Spark安装 Spark的Local模式仅需要单个虚拟机节点即可,无需启动hadoop集群。实验步骤如下: 将spark的安装包上传到虚拟机node01中(建议路径:/opt/software/spark)并解压缩文件。将解压文件夹重命名为spark-local 解…...
爱普生RTC模块RA8804CE在ADAS域控制器的应用
在汽车智能化、自动化飞速发展的时代,ADAS(高级驾驶辅助系统)的多传感器融合与实时决策高度依赖精准的时间基准。毫秒级的时间偏差可能导致传感器数据错位,直接影响行车安全。爱普生RA8804CE实时时钟模块凭借其内置的32.768 kHz晶…...
开箱即用!推荐一款Python开源项目:DashGo,支持定制改造为测试平台!
大家好,我是狂师。 市面上的开源后台管理系统项目层出不穷,对应所使用到的技术栈也不尽相同。 今天给大家推荐一款开源后台管理系统: DashGo,不仅部署起来非常的简单,而且它是基于Python技术栈实现的,使得基于它进行…...
C++使用WebView2控件,通过IPC通信与Javascript交互
引言 在现代桌面应用程序开发中,Web技术与原生应用的融合变得越来越普遍。Microsoft的WebView2控件为C开发者提供了一个强大的工具,使他们能够在桌面应用中嵌入基于Chromium的Web浏览器引擎。本文将详细介绍如何在C应用程序中使用WebView2控件ÿ…...
算法中Hash备胎——LRU的设计与实现
核心内容1.理解LRU的原理2.理解LRU是如何实现的3.能够通过代码实现LRU 缓存是应用软件的必备功能之一,在操作系统、Java里的Spring、mybatis、redis、mysql等软件中都有自己的内部缓存模块,而缓存是如何实现的? 在操作系统教科书里我们知道…...
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路
Profinet邂逅ModbusRTU:印刷厂有网关“一键打通”通信链路 在现代化印刷厂的生产线上,高效稳定的设备通信是保障印刷质量和生产效率的关键。某印刷厂的印刷机控制系统采用了西门子PLC进行自动化控制,同时还有众多基于ModbusRTU协议的传感器和…...