Django(五、视图层)

文章目录

  • 一、视图层
      • 1.视图函数返回值的问题
      • 2.三板斧的使用
            • 结论:在视图文件中写视图函数的时候不能没有返回值,默认返回的是None,但是页面上会报错,用来处理请求的视图函数都必须返回httpResponse对象。
  • 二、JsonReponse序列化类的使用
      • form表单上传文件
  • 三、FBV与CBV

一、视图层

1.视图函数返回值的问题

当视图函数返回为一个空的时候会报错

def index(request):# return HttpResponse('is index!')return None

在这里插入图片描述
把上面一句话翻译过来就是视图函数必须返回一个HttpResponse对象

2.三板斧的使用

HttpResponse: 字符串
render:渲染html页面
redirect:重定向的

1.HttpResponseclass HttpResponse(HttpResponseBase)pass# 括号内直接跟一个具体的字符串作为响应体2.render
def render(request, template_name, context=None, content_type=None, status=None, using=None):request: 用于生成响应的请求对象。template_name:要使用的模板的完整名称,可选的参数context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。content = loader.render_to_string(template_name, context, request, using=using)return HttpResponse(content, content_type, status)3.redirect
def redirect(to, *args, permanent=False, **kwargs):传递要重定向的一个硬编码的URL或者路由redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirectreturn redirect_class(resolve_url(to, *args, **kwargs))eg: redirect内部是继承了HttpRespone类
结论:在视图文件中写视图函数的时候不能没有返回值,默认返回的是None,但是页面上会报错,用来处理请求的视图函数都必须返回httpResponse对象。

二、JsonReponse序列化类的使用

前后端数据交互需要使用json作为序列化,实现跨语言数据传输。

  1. 混合开发项目:前端页面和后端代码写到一块
  2. 前后端分离项目:前端是一个项目,后端是一个项目,后端只需要写接口

前端序列化:JSON.stringify(),JSON.parse()
后端序列化:json.dumps(), json.loads()

1.json序列化

# 导入模块
import jsondef index(request):# 将后端字典序列化发送到前端user_dict = {'name':'jack','age':18}# 先转成json格式字符串json_str = json.dumps(user_dict)# 将该字段返回return HttpResponse(json_str)# ensure_ascii 内部默认True自动转码,改为False不转码,只生成json格式,双引号

2.JsonResponse序列化

# 导入JsonResponse模块
from django.http import JsonResponse
def index(request):# 将后端字典序列化发送到前端user_dict = {'name': 'jack你好', 'age': 18}
# JsonResponse自动编码并返回给前端页面
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})本质看源码:
user_dict,json_dumps_params={'ensure_ascii':False} :解决前端汉字转码问题

在这里插入图片描述JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False(是在前端页面更改的)

列表序列化

def index(request):user_dice = [1, 2, 3, 4, 5, 6, 7, 8, 9]return JsonResponse(user_dice, safe=False)是否可以被序列化看通过json.JSONEncoder 查看源码

form表单上传文件

1.图片文件上传

views.py

def form_file(request):if request.method == 'POST':  # 当点击提交按钮才会走这一步form_obj = request.FILES.get('myfile')  # 获取上传的文件form_name1 = form_obj.name  # 获取上传文件的文件名import uuidrandom_str = str(uuid.uuid4())  # 随机字符串form_name = random_str + '.' + form_name1.split('.')[-1]  # 按点切分取最后一个数据with open(form_name, 'wb') as f:  for line in form_obj:  # 写入文件f.write(line)  return render(request, 'form_file.html')

form_file.html

数据要携带数据,下述两个参数写成下述的参数
{# 1.method指定成post  2.enctype换成form-date #}
<form action="" method="post" enctype="multipart/form-data"><input type="file" name="myfile"><input type="submit">
</form>

request对象方法

1.获取请求方式POST/GET
request.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。2.request.POST
获取POST请求提交普通的键值对数据 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成3.获取GET请求
request.GET
获取GET请求	一个类似于字典的对象,包含 HTTP GET 的所有参数4.获取文件
request.FILES
一个类似于字典的对象,包含所有的上传文件信息。
FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。5.原生的浏览器发过来的二进制数据
request.body  
一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。6.拿到路由
request.path 
个字符串,表示请求的路径组件(不含域名)7.拿到路由
request.path_info8.能过获取完整的url及问号后面的参数 
request.get_full_path() 

三、FBV与CBV

FBV基于函数的视图def index(request):return HttpResponse对象CBV基于类的视图from django import viewsclass MyLoginView(views.View):def get(self, request):return HttpResponse('from CBV get function')def post(self, request):return HttpResponse('from CBV post function')path('login/', views.MyLoginView.as_view())会自动根据请求方法的不同自动匹配对应的方法并执行

CBV源码解析

1.从CBV的路由匹配切入path('login/', views.MyLoginView.as_view())1.类名点名字(名字的查找问题)2.类名点名字并加括号调用(静态方法、绑定给类的方法)
2.函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法path('login/', views.view)  # CBV路由本质还是FBV
3.浏览器地址栏访问login路由需要执行view函数1.产生我们自己编写类的对象2.对象调用dispatch方法(注意查找顺序)
4.研究父类中的dispatch方法获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行class View:@classmethoddef as_view(cls, **initkwargs):def view(request, *args, **kwargs):self = cls(**initkwargs)return self.dispatch(request, *args, **kwargs)def dispatch(self, request, *args, **kwargs):handler = getattr(self, request.method.lower())return handler(request, *args, **kwargs)

分步解析
1.从CBV的路由匹配切入,path(‘login/’, views.MyLoginView.as_view()),根据观察路由后面的函数可知,MyLoginView是我们自己定义的类,但类点一个(as_view())证明as_view()是一个方法,但是as_view既不是自定义类中的属性也不是自定义类的方法,由此可得,只要往类的父类里面去寻找。

2.MyLoginView.as_view(),类名点一个属性加括号,有两种情况

   1.as_view是一个普通函数,是通过staticmethod绑定给类的方法2.绑定给类的方法,@classmethod修饰的函数  类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入

3.通过ctrl点View查看源码可知
在这里插入图片描述
发现这个返回值仍然不是一个明确的函数,我们还需要查看dispatch方法的返回值,在此之前,我们需要分析出,dispatch是绑定对象的动态方法,这个self是由我们自己定义的类所产生的对象
4.查看dispatch函数,由于我们对象及其类的属性中都没有dispatch,所以这个函数还是我们父类View的类体函数

在这里插入图片描述
至此,我们就剖析出,我们的as_view()函数做了这么几件事:

封装了一个函数,作为对应路由的函数
封装的函数中,让我们的自定义类产生了一个对象,并让对象执行方法dispatch返回结果
dispatch辨认了请求方式,根据请求方式返回了某个类体函数的结果(HttpResponse对象)
所以视图类,就是将一个路由根据请求方式又重新划分了不同的视图函数,不必再在视图函数中对请求方式进行判断了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/192267.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[单片机课程设计报告汇总] 单片机设计报告常用硬件元器件描述

[单片机课程设计必看] 单片机设计报告常用描述 硬件设计 AT89C51最小系统 AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS16位单片机&#xff0c;片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器&#xff0c;期间采用ATMEL公司的高…

FreeRTOS源码阅读笔记3--queue.c

消息队列可以应用于发送不定长消息的场合&#xff0c;包括任务与任务间的消息交换&#xff0c;队列是 FreeRTOS 主要的任务间通讯方式&#xff0c;可以在任务与任务间、中断和任务间传送信息&#xff0c;发送到 队列的消息是通过拷贝方式实现的&#xff0c;这意味着队列存储…

Python入门:一文详解Python列表(List)操作方法

文章目录 前言一、创建一个列表二、访问列表中的值三、更新列表四、删除列表元素六、Python列表截取七、Python列表操作的函数和方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②…

部署百川大语言模型Baichuan2

Baichuan2是百川智能推出的新一代开源大语言模型&#xff0c;采用 2.6 万亿 Tokens 的高质量语料训练。在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。包含有 7B、13B 的 Base 和 Chat 版本&#xff0c;并提供了 Chat 版本的 4bits 量化。 模…

网络运维Day16

文章目录 Docker简介什么是容器命名空间&#xff1a; Docker 的优缺点 Docker安装Docker镜像管理什么是镜像镜像管理 Docker容器管理运行容器容器启动、停止、重启拷贝文件进入容器容器与应用 DockerfileDockerfile 语法案例 总结 Docker简介 什么是容器 容器是用来装东西的&a…

Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求

版本说明 当前版本号[20231114]。 版本修改说明20231114初版 目录 文章目录 版本说明目录HTTP协议1、网址1.1 网址的概念1.2 URL的组成1.3 知识要点 2、HTTP协议的介绍2.1 HTTP协议的概念及作用2.2 HTTP协议的概念及作用2.3 浏览器访问Web服务器的过程 3、HTTP请求报文3.1 H…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

红队专题 招募六边形战士队员[16]超级终端(1)消息 宏的定义映射cmdshell.cpp重载 构造函数Onsize 随窗口大小事件回车键发送命令添加字符转换类 StringToTransform [17]超级终端(2)接受命令创建m_cmd c类发送 接收客户端远端进程关闭 招募六边形战士队员 一起学习 代码审计、安…

景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商

根据IDC相关数据统计&#xff0c;全球数据量正在经历爆炸式增长&#xff0c;预计将从2016年的16.1ZB猛增至2025年的163ZB&#xff0c;其中大部分是非结构化数据&#xff0c;被直接利用&#xff0c;必须通过数据标注转化为AI可识别的格式&#xff0c;才能最大限度地发挥其应用价…

网络运维Day17

文章目录 什么是数据库MySQL介绍实验环境准备构建MySQL服务连接数据库修改root密码 数据库基础常用的SQL命令分类SQL命令使用规则MySQL基本操作创建库创建表查看表结构 记录管理命令 数据类型数值类型 数据类型日期时间类型时间函数案例枚举类型 约束条件案例修改表结构添加新字…

C++二分查找算法:最大为 N 的数字组合

涉及知识点 二分查找 数学 题目 给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如&#xff0c;如果 digits [‘1’,‘3’,‘5’]&#xff0c;我们可以写数字&#xff0c;如 ‘13’, ‘551’, 和 ‘1351315’。 返回 可以生成的…

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于群居蜘蛛优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

python语言的由来与发展历程

Python语言的由来可以追溯到1989年&#xff0c;由Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;创造。在他的业余时间里&#xff0c;Guido van Rossum为了打发时间&#xff0c;决定创造一种新的编程语言。他受到了ABC语言的启发&#xff0c;ABC语言是一种过程式编程语…

PHP 服装销售管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 服装销售管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php服装销售管理系统1 二、功能介绍 (1)员工管理&#xff1a;对员工信息…

【电子通识】USB端口颜色编码标识

不知道你有没有发现 USB 口有不同的颜色&#xff0c;黑色、蓝色、紫色、红色、黄色等等&#xff0c;你知道不同颜色的 USB 口各代表什么意思吗&#xff1f; 这些颜色不是USB规范所要求的&#xff0c;设备制造商之间也不一致。例如&#xff0c;Intel使用橙色表示充电端口&#…

DAY54 392.判断子序列 + 115.不同的子序列

392.判断子序列 题目要求&#xff1a;给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是…

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度&#xff1a;Strongly Disagree——非常不同意&#xff0c;用“0”表示&#xff1b;Disagree——不同意&#xff0c;用“1”表示&#xff1b;Agree--同意&#xff0c;用“2”表示&#xff1b;Strongly Agree--非常…

并发编程由浅及深(一)

并发编程重要吗&#xff1f;当然重要&#xff0c;因为并发在我们的项目中真实存在&#xff0c;如果你不能充分了解它那么很可能造成严重的生产事故。最近隔壁项目组出了一个问题&#xff0c;每次请求接口之后都发现线程固定增加了5个&#xff0c;而且线程数一直增加没有减少&am…

修炼k8s+flink+hdfs+dlink(七:flinkcdc)

一 &#xff1a;flinkcdc官网链接。 https://ververica.github.io/flink-cdc-connectors/release-2.1/content/about.html 二&#xff1a;在flink中添加jar包。 在flink lib目录下增加你所需要的包。 https://kdocs.cn/join/gv467qi?f101 邀请你加入共享群「工作使用重要工具…

【uniapp】确认弹出框,选择确定和取消

代码如下&#xff1a; <view style"display: flex; justify-content: space-around;"><button class"button" click"submit">t提交</button> </view>submit(){let thatthisuni.showModal({title: 提示&#xff1a;,con…

react Antd3以下实现年份选择器 YearPicker

项目antd版本低&#xff0c;没有直接可使用的年份选择器&#xff0c;参考此篇&#xff08;使用antd实现年份选择器控件 - 掘金&#xff09; 一开始在state里设置了time&#xff1a; this.state {isopen: false,time: null } 在类似onChange事件里this.setState({time: valu…