Django视图函数技巧,从入门到实战
文章目录
- Django视图函数
- 1.request对象的方法
- 2.视图函数的常用的返回对象
- (1)response对象
- (2)JsonResponse对象
- (3)redirect() :给浏览器了一个30x的状态码
- 3.设置响应头和状态码
- (1)设置响应头键值对
- (2)设置响应状态码
- 4.CBV模式
- (1)CBV模式写法,先引入类
- (2)CBV模式下传参
Django视图函数
Django中一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
无论视图本身包含什么逻辑,都要返回响应。大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。
视图读取参数
url以查询字符串的方式传参,使用request.GET.get(“name”, default)的形式获取参数值
url以路径传参,使用路径转换器来进行获取参数,在django1.0版本的时候只能通过正则表达式来获取参数。
1.request对象的方法
request.GET:获取url中的查询字符串的数据
request.POST: 获取表单提交的数据
request.path:获取请求的路径
request.method:获取请求的方法得到的值是 请求方法GET or POST等 大写

request.COOKIES:获取请求过来的cookies
request.user:获取请求的用户对象,可以通过它判断用户是否登录,并获取用户信息
request.session:一个既可读又可写的类似字典的对象,表示当前会话
request.META:一个标准的Python字典,包含所有的HTTP首部。具体的头部信息取决于客户端和服务器,
#request.META 字典类型数据,所有的请求头的键都加上了一个HTTP_键名称

print(request.get_full_path()) #当前请求路径包含查询参数
request.encoding
一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 ‘utf-8’)。
这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。

request.GET 获取查询参数,#不管是post或get请求,当url中含有查询参数时,要在后台的request对象中获取查询参数
,用的属性都是request.GET
浏览器输入查询参数 a=1&b=“景浩”

获取的字典,值是列表类型

print(request) 获取的是WSGIRequest对象

2.视图函数的常用的返回对象
HttpResponse对象,可以直接返回一些字符串
render: 将数据在模板中渲染并显示,使用方式为return render(request, template_path, {k:v})字典中key与value就是要向前端渲染出的数据。
JsonResponse返回一个json类型,通常用于与前端进行ajax交互
(1)response对象
属性
HttpResponse.content:响应内容
HttpResponse.charset:响应内容的编码
HttpResponse.status_code:响应的状态码
(2)JsonResponse对象
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)
这个类是HttpRespon的子类,它主要和父类的区别在于:
1.它的默认Content-Type 被设置为: application/json
2.第一个参数,data应该是一个字典类型,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。 默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。
3.json_dumps_params参数是一个字典,它将调用json.dumps()方法并将字典中的参数传入给该方法。
使用HttpResponse对象来响应数据的时候,还可以通过content_type指定格式:
return HttpResponse(json.dumps(data),content_type=“application/json”)
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。
response = JsonResponse([1, 2, 3], safe=False)
(3)redirect() :给浏览器了一个30x的状态码
参数可以是:
1. 一个模型:将调用模型的get_absolute_url() 函数
2.一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
3.一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
你可以用多种方式使用redirect() 函数。
传递一个具体的ORM对象(了解即可)
将调用具体ORM对象的get_absolute_url() 方法来获取重定向的URL:
301 redirect: 301 代表永久性重定向 网址永久地迁移了,原网址下的资源都没有了
302 redirect: 302 代表临时重定向 临时的做个跳转,项目可能在升级,原网址资源还在

重定向案例
首先在url里面新添加一个用来重定向的路径

建个新页面

视图函数里面,添加跳转视图函数new(),并在login2路径下,用户输入用户名jinghao 即重定向到 /new/ 新页面
redirect里面写的第一个参数为路径,可以添加第二个参数permanent=True,表示永久重定向。默认是临时重定向

浏览器访问,输入用户名jinghao,实现跳转

永久重定向


3.设置响应头和状态码
理论上,客户端发来请求,服务端应根据响应的成功与否,发送给客户端相关的状态码
服务器报错,也应该返回状态码告诉客户端是什么错误
响应对象主要有三种形式:
HttpResponse() 回复字符串 默认响应状态码是200
render() 回复页面内容 默认响应状态码是200
redirect() 重定向 默认响应状态码是302


如果发生什么问题,比如经过各种逻辑判断逻辑有误,参数不对等,服务端此时应该回复异常的状态码
(1)设置响应头键值对
def code(request):
ret = HttpResponse(“状态码”)
ret[‘name’] = “jinghao” # 添加响应头键值对 #会调用HttpResponse setattr方法,在setattr()方法中对响应头键值对进行了封装
return ret
浏览器访问查看

响应数据在前端都能拿到,拿出来就可以做一些处理
比如用户名密码认证成功之后,比如加个键值对 isLogin=True
响应头在客户端拿到以后,再登录某个页面之后,可以携带这个数据,后台拿到这个数据之后,就知道该用户已经登录了,不用重新登录

(2)设置响应状态码
#设置状态码
def code(request):
ret = HttpResponse(“状态码”)
ret[‘name’] = “jinghao” # 添加响应头键值对 #HttpResponse setattr
ret.status_code = 404 # 修改状态码
return ret
正常状态下不需要设置状态码,但为了接口规范,一些情况下需要设置状态码
render HttpResponse Redirect 三种响应方式都可以修改响应状态码

4.CBV模式
FBV(function base views) 就是在视图里使用函数处理请求。
之前都是FBV模式写的代码,所以就不写例子了。
CBV(class base views) 就是在视图里使用类处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。
所以Django在后来加入了Class-Based-View。可以让我们用类写View。
这样做的优点主要下面两种:
提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
如果用class-based view写的话,就是下面这样
(1)CBV模式写法,先引入类
from django.views import View
#自己写的类要继承View类
class BookView(View):
# 通过反射获取到请求方法对应的类中的方法来执行
#需要什么类型的请求。就定义什么方法,比如get,post,方法名固定
def get(self,request):
return HttpResponse(‘book’)
# 需要处理什么请求方法,就写对应名称的方法
根据其继承的类,我们可以看到,原码中支持的八种方法类型,我们在类中写的方法必须是这八种方法其中的一种,不然会报错

Django的url是将一个请求分配给可调用的函数的,而不是一个class。
针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,
然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。
到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。
原码部分
def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names: #get# ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs) 就是get # HttpResponse('ok')dispatch方法就是为了获取我们在类中写的方法,然后返回方法执行返回结果 注意:使用CBV时,urls.py中也做对应的修改:from django.contrib import admin
from django.urls import path
from login import viewsurlpatterns = [path('admin/', admin.site.urls),path('', views.login),# path('login/', views.login),# path('logininfo/', views.logininfo),path('login2/', views.login2),path('new/', views.new),path('code/', views.code),path('book/', views.BookView.as_view()), 注意,这里是views.类名.as_view()
]
我们继承的类View类中有as_view方法

浏览器访问

(2)CBV模式下传参
创建个文章类

使用get方法


如果想看2018年的文章
urls.py路径需要配置,year是变量名,需要再视图函数里面传进去

views视图函数需要传参year

浏览器访问
article/后面只要是个int类型的数字数字都可以访问


使用post方法提交表单,post方法也要传参

form表单使用post方法,在当前页面提交

浏览器显示

输入一个用户名提交

后端可以通过request.POST获取提交数据。获取的是QueryDict字典类型,字典的值是列表

相关文章:
Django视图函数技巧,从入门到实战
文章目录 Django视图函数1.request对象的方法2.视图函数的常用的返回对象(1)response对象(2)JsonResponse对象(3)redirect() :给浏览器了一个30x的状态码 3.设置响应头和状态码(1&am…...
部署实战--修改jar中的文件并重新打包成jar文件
一.jar文件 JAR 文件就是 Java Archive ( Java 档案文件),它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…...
RT-Thread线程管理(使用篇)
layout: post title: “RT-Thread线程管理” date: 2024-1-26 15:39:08 0800 tags: RT-Thread 线程管理(使用篇) 之后会做源码分析 线程是任务的载体,是RTT中最基本的调度单位。 线程执行时的运行环境称为上下文,具体来说就是各个变量和数据,…...
【HarmonyOS】鸿蒙开发之ArkTs初步认识——第2.1章
ArkTs简介 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 以下图可以展示Js,TS,ArkTs的关系 ArkTs基础语…...
随手记:uni-app中使用iconfont彩色图标
1、打开阿里巴巴矢量库 2、将下载的压缩文件解压,cmd打开控制台 3、安装npm install -g iconfont-tools(首次使用安装) 4、输入iconfont-tools会生成一个文件夹 5、打开这个文件夹,用里面的相应的css就行...
02-OpenFeign-微服务接入
1、依赖 由于是spring cloud项目,注意spring-boot、cloud、alibaba的版本兼容性 1.1、父级依赖 <properties><java.version>1.8</java.version><spring-boot.version>2.7.18</spring-boot.version><spring.cloud.version>20…...
【前端工程化】环境搭建 nodejs npm
文章目录 前端工程化是什么?前端工程化实现技术栈前端工程化环境搭建 :什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么? 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…...
在VM虚拟机搭建NFS服务器
NFS共享要求如下: (1)共享“/mnt/自已姓名的完整汉语拼音”目录,允许XXX网段的计算机访问该共享目录,可进行读写操作。(说明:XXX网段,请根据你的规划,再具体指定…...
springboot并mybatis入门启动
pom.xml,需要留意jdk的版本(11)和springboot版本要匹配(2.7.4),然后还要注意mybatis启动l类的版本(2.2.2) <?xml version"1.0" encoding"UTF-8"?> <project xm…...
什么是单例模式与饿汉式单例模式的区别是什么?
什么是单例模式与饿汉式单例模式的区别是什么? 单例模式和饿汉式单例模式都是软件设计模式,它们的区别在于实例的创建时间和线程安全性。 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。单例模式可以保…...
【数据结构】认识数据结构 (通俗解释)
目录 1.认识数据结构 1.1 什么是数据结构 1.1.1 什么是数据? 1.1.2 什么是结构? 1.1.3 通俗比喻: 1.1.4 标准概念概念定义: 1.2为什么需要数据结构? 1.认识数据结构 1.1 什么是数据结构 数据结构是由"数…...
C语言——深入理解指针(1)
目录 1.内存和地址 a 内存的理解 b 如何理解编址 2.指针变量和地址 a 取地址操作符 b 指针变量 c 解引用操作符 d 指针变量的大小 1.内存和地址 a 内存的理解 假想这样一个场景,你的朋友找你玩,到了你家小区,如何让她迅速的找到…...
MySQL原理(五)事务
一、介绍: 1、介绍: 在计算机术语中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务是恢复和并发控制的基本单位。 2、事务的4大特性 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性…...
算法学习——华为机考题库4(HJ26 - HJ30)
算法学习——华为机考题库4(HJ26 - HJ30) HJ26 字符串排序 描述 编写一个程序,将输入字符串中的字符按如下规则排序。 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 如,输入: Type 输出…...
STM32学习笔记(三) —— GPIO点亮LED
1.GPIO简介 GPIO,全称是General-purpose input/output(通用输入输出)。在单片机中是表示能被控制的引脚,能检测输入信号的高低电平,也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚,其中有51个…...
gRPC使用详解
起源特点主要优缺点应用场景组成部分使用方法SpringBoot集成gRPCVert.x集成gRPCNacos集成gRPC监控gRPC调用过程Java使用示例 起源 gRPC的起源可以追溯到2015年,当时谷歌发布了一款开源RPC框架,名为gRPC。gRPC的设计初衷是为了提供一种标准化、可通用和跨…...
海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播
Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制,资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播,资源下…...
测试工作(新入职)感悟
背景:我之前在小规模传统公司,工作强度一般,早九晚六,偶尔加班。现在就职的是大型同行业互联网公司,工作强度大,早九晚九,目前已经入职两个礼拜。 基于这个背景,新工作对我是比较有…...
hivesql的基础知识点
目录 一、各数据类型的基础知识点 1.1 数值类型 整数 小数 float double(常用) decimal(针对高精度) 1.2 日期类型 date datetime timestamp time year 1.3 字符串类型 char varchar / varchar2 blob /text tinyblob / tinytext mediumblob / mediumtext lon…...
Linux下的线程操作
一、多线程的创建于退出 1. pthread_create(线程的创建) pthread_create 是 POSIX 线程库中的函数,用于创建一个新的线程。 函数原型如下: int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
