Django(五、视图层)

news2024/10/5 15:32:13

文章目录

  • 一、视图层
      • 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.HttpResponse
    class 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 HttpResponseRedirect
    return 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 json

def 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 uuid
        random_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_info

8.能过获取完整的url及问号后面的参数 
request.get_full_path() 

三、FBV与CBV

FBV
	基于函数的视图
	def index(request):return HttpResponse对象

CBV
	基于类的视图
	from django import views
  	 class 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:
     @classmethod
     def 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.coloradmin.cn/o/1209498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用字典树实现一个可以自动补全的输入框

说在前面 平时我们在终端输入命令的时候是不是都可以通过tab键来进行快速补全&#xff1f;那么有没有想过怎么去实现这个自动补全的功能呢&#xff1f;今天让我们一起来使用字典树实现一个可以自动补全的输入框。 效果展示 体验地址 http://jyeontu.xyz/jvuewheel/#/JAutoComp…

相约黄浦江畔,汇聚AI与边缘计算的力量

很高兴告诉您&#xff1a;全球边缘计算大会上海站即将盛大启幕&#xff01; 第八届全球边缘计算大会将于12月16日&#xff08;周六&#xff09;在上海黄浦江旁边的三至喜来登酒店召开&#xff0c;距离这场边缘计算年度盛会开幕仅剩最后35天啦&#xff01; 参会收益 开阔视野&am…

【python】爬取酷狗音乐Top500排行榜【附源码】

一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件和目录操作。 如果出现模块报错 进入控制台输入&#xff…

leetcode:138. 随机链表的复制

一、题目&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; struct Node* copyRandomList(struct Node* head) 二、思路 本题是给出一个单链表&#xff0c;单链表的每个结点还额外有一个随机指针&#xff0c;随机指向其他结点&am…

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取&#xff08;通过UART串口来控制模块&#xff09; 文章目录 V-LD1命令发送消息回复通信示例雷达数据获取宏定义通信代码运行效果附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转…

Istio学习笔记- 服务网格

Istio 服务网格 参考&#xff1a;Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes&#xff0c;以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用&#xff0c;为复杂的部署带来了标准的通用流量管理、遥…

大数据知识图谱项目——基于知识图谱的电影问答系统(超详细讲解及源码)

大数据知识图谱项目——基于知识图谱的电影问答系统&#xff08;超详细讲解及源码&#xff09; 一、项目概述 知识图谱是将知识连接起来形成的一个网络。由节点和边组成&#xff0c;节点是实体&#xff0c;边是两个实体的关系&#xff0c;节点和边都可以有属性。知识图谱除了…

【网络奇缘】- 计算机网络|网络类型|性能指标

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分类 1.根据范围分类 ​编辑 2.按使用者分​编辑 3.按交换技术分 ​编辑4.按拓扑结构分 ​…

基恩士软件的基本操作(三,监控台调试)

目录 模拟器 模拟器编辑 plc的传输 监控器 在线编辑 程序出现问题时的排查方法 接点跳转功能 交叉参考功能 关系映射功能 程序监控器 登录监控器&#xff08;查看与修改软元件的值&#xff09; 批量监控器 实时时序图 单元监控器 I/O单元监控器 运动单元监控器…

【Shell脚本11】Shell 函数

Shell 函数 linux shell 可以用户定义函数&#xff0c;然后在shell脚本中可以随便调用。 shell中函数的定义格式如下&#xff1a; [ function ] funname [()]{action;[return int;]}说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何…

Latex在图表标题里面引用参考文献时,出现参考文献顺序混乱的解决方案(适用于bibtex)

问题描述 如果你在figure环境的\caption或\captionof中使用\cite&#xff0c;但是参考文献的顺序仍然不正确&#xff0c;可能是因为LaTeX的处理流程导致了这个问题。 比如图片在第二章节但里面引用了参考文献&#xff0c;在文章末尾的参考文献第二章图片的参考文献顺序&#…

CCNA课程实验-14-Final_Lab

目录 实验条件网络拓朴需求 配置实现1. 配置PC1~3, DHCP_Server的vlan2. VLAN10、20的网关为MSW1对应的SVI&#xff0c;VLAN30、40的网关为MSW2对应的SVI&#xff1b;3. 配置5台交换机之间线路均为Trunk4. 配置5台交换机均启用Rapid-PVST(RSTP)5. 配置DHCP Server&#xff0c;创…

Uniapp开发 购物商城源码 在线电商商城源码 适配移动终端项目及各小程序

lilishop电商商城系统 商城移动端&#xff0c;使用Uniapp开发&#xff0c;可编译为所有移动终端项目及各小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88487579 源码下载2&#xff1a;关注我留言

Camtasia 2024中文版功能介绍

在如今的数字时代&#xff0c;屏幕录制已成为许多工作或学习中不可或缺的一部分&#xff0c;无论是制作教学视频、演示软件功能&#xff0c;还是为了录制游戏过程&#xff0c;屏幕录制软件都扮演着至关重要的角色。实际上屏幕录制不仅仅可以单纯录制屏幕&#xff0c;还能玩出非…

​软考-高级-系统架构设计师教程(清华第2版)【第5章 软件工程基础知识(190~233)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第5章 软件工程基础知识&#xff08;190~233&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

【Linux网络】1分钟使用shell脚本完成DNS主从解析服务器部署(适用于centos主机)

DNS正向解析主从解析服务器脚本 1、脚本内容 主服务器脚本 #!/bin/bash ##先修改本地DNS缓存服务器 read -p "请输入主服务器ip地址&#xff1a;" masterIP sed -i /DNS/d /etc/sysconfig/network-scripts/ifcfg-ens33 echo "DNS$masterIP" >> /e…

electronjs入门-编辑器应用程序

我们将在Electron中创建一个新项目&#xff0c;如我们在第1章中所示&#xff0c;名为“编辑器”&#xff0c;我们将在下一章中使用它来创建编辑器&#xff1b;在index.js中&#xff0c;这是我们的主要过程&#xff1b;请记住为Electron软件包放置必要的依赖项&#xff1a; npm…

【MediaFoundation】相关的概念

MF 概览 Media Foundation 提供了两种不同的编程模型&#xff0c;左边展示的是端到端的媒体数据模型&#xff0c;主要用在&#xff1a;播放URL或者文件&#xff0c;以及控制流。 在图表右侧展示的第二种模型中&#xff0c;应用程序可以从源头拉取数据&#xff0c;也可以将数据…

代号:408 —— 1000道精心打磨的计算机考研题

文章目录 &#x1f4cb;前言&#x1f3af;计算机科学与技术专业介绍&#xff08;14年发布&#xff09;&#x1f9e9;培养目标&#x1f9e9;毕业生应具备的知识和能力&#x1f9e9;主要课程 &#x1f3af;代号&#xff1a;408&#x1f525;文末送书&#x1f9e9;有什么优势&…

量化交易:使用 python 进行股票交易回测

执行环境: Google Colab 1. 下载数据 import yfinance as yfticker ZM df yf.download(ticker) df2. 数据预处理 df df.loc[2020-01-01:].copy()使用了 .loc 方法来选择索引为 ‘2020-01-01’ 以后的所有行数据。通过 .copy() 方法创建了一个这些数据的副本&#xff0c;确…