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_allowed
    return handler(request, *args, **kwargs) 就是get  # HttpResponse('ok')

dispatch方法就是为了获取我们在类中写的方法,然后返回方法执行返回结果 

注意:使用CBV时,urls.py中也做对应的修改:

from django.contrib import admin
from django.urls import path
from login import views

urlpatterns = [
    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字典类型,字典的值是列表
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux---动静态库

前言 在初学Linux的时候,简单的提到过动静态库,但当时只是简单的讲述了一下什么是动态库,什么是静态库,我们可以在此基础上更进一步---制作库。在使用gcc编译器的时候,是默认使用动态链接的。 静态库 静态库&#x…

【数据结构 08】红黑树

一、概述 红黑树,是一种二叉搜索树,每一个节点上有一个存储位表示节点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长上两倍,因而是接进平衡的。 红黑树性质: 根节点是黑色红节点的两个孩子…

《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)

文章目录 10.1 实际案例分析10.1.1 基础知识10.1.2 完整案例:天气数据分析10.1.3 拓展案例 1:股票价格分析10.1.4 拓展案例 2:信号处理 10.2 Numpy 最佳实践10.2.1 基础知识10.2.2 完整案例:高效数组操作10.2.3 拓展案例 1&#x…

面试题 02.07. 链表相交(力扣LeetCode)

文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 …

【轮式平衡机器人】——TMS320F28069片内外设之ADC

一、ADC概述 这一部分不是我们的重点,原理分类啥的这里简要说明! 步骤:采样、保持、量化、编码 将采样电平(模拟值)转换为数字值的方法:直接比较型(并行ADC、逐次逼近型ADC)&…

通俗易懂理解注意力机制(Attention Mechanism)

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。 一、参考资料 大话注意力机制(Attention Mechanism) 注意力机制(Attention Mechanism) 深度学习中的注意力机制 注意力机制 二、注意力…

关于最小系统板PCB设计后的一些反思

简介 趁着刚刚画完板子寄回来,在这里做一些记录。 板子状况 这里打烊了5块PCB,但是没有进行SMT贴片,后续如果有芯片可以焊接上去进行后续验证。 封装问题 这里可以看到,我这里两侧的排针都是焊盘,不是通孔&#…

【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 1639. 通过给定词典构造目标字符串的方案数 给你一个字符串列表 words 和一个目标字符串 tar…

编译Opencv3.3.1遇到的编译器无法识别的警告的问题解除:

问题描述: 本文,就是在一个硬件的SDK中用到了opencv3.3.1的版本,在笔者目前的VS2019,CUDA11版本下编译的问题和解决。在做Cmake的configure的时候,Cmake报了一个找不到编译器版本的错误, Selecting windows SDK version 10.0.1904…

TOP100 矩阵

1.73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n < 200-2^31 < matrix[i][j] < 2^31 - 1 思路&#xf…

EMQX 单机及集群搭建

目录 1. 通过 Yum 源安装&#xff08;CentOS7 单机安装&#xff09; 1.1. 通过以下命令配置 EMQX Yum 源&#xff1a; 1.2. 运行以下命令安装 EMQX&#xff1a; 1.3. 运行以下命令启动 EMQX&#xff1a; 1.4. 访问 http://192.168.88.130:18083&#xff0c;默认用户名: adm…

Java项目要不要部署在Docker里?

部署Java项目有很多种方式&#xff0c;传统的方式是直接在物理机或虚拟机上部署应用&#xff0c;但为什么现在容器化部署变得越来越流行&#xff0c; 个人觉得原因有以下几个&#xff1a; 1、 环境一致性&#xff1a;使用Docker可以确保开发、测试和生产环境的一致性&#xff…

如何使用保留可探测字段参数的方法解决视频监控管理平台EasyCVR无法启动的问题

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

飞桨paddlespeech语音唤醒推理C INT8 定点实现

前面的文章&#xff08;飞桨paddlespeech语音唤醒推理C定点实现&#xff09;讲了INT16的定点实现。因为目前商用的语音唤醒方案推理几乎都是INT8的定点实现&#xff0c;于是我又做了INT8的定点实现。 实现前做了一番调研。量化主要包括权重值量化和激活值量化。权重值由于较小且…

Log4j2-24-log4j2 相同的日志打印 2 次

现象 相同的日志打印了两次&#xff0c;且因为日志的配置不同&#xff0c;导致脱敏的情况不一致。 代码与配置 代码 package com.ryo.log4j2.cfg.additivity;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;public class SimpleDemo…

JNPF低代码平台与其他低代码工具功能有什么不同?

JNPF低代码平台是一种新兴的技术解决方案&#xff0c;它可以帮助开发者快速构建应用程序而无需编写大量的代码。本文将深入了解JNPF低代码平台的常见类型与功能特点&#xff0c;帮助读者更好地理解和应用这项技术。 JNPF低代码平台的功能特点。首先&#xff0c;JNPF低代码平台具…

day28 回溯算法part4

93. 复原 IP 地址 中等 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址&#xff0c;但是 “0.011…

报错 Cannot read properties of undefined(reading‘addEventListener‘)如何解决

我在制作项目中遇到了一个问题&#xff0c;给大家分享一下&#xff0c;如下图&#xff1a; 问题&#xff1a;这是我给一个input输入框绑定的监听事件出现的报错 翻译&#xff1a;无法读取未定义的属性(读取 addEventListener ) 错误原因&#xff1a;js中操作的dom元素的函数方…

知识库是什么?为什么这么多企业都在用?

在信息化的时代&#xff0c;万物互联&#xff0c;企业获取、积累和应用知识的方式也因此发生了巨大的变化。有一项重要工具正是知识库&#xff0c;许多企业和组织都在广泛地使用它。那么&#xff0c;到底什么是知识库&#xff1f;为什么它能受到广泛的接纳和应用呢&#xff1f;…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作(结构清晰万字长文)

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB5.1 Mongodb 和 Mongoose5.2 推荐在项目中使用 Mongoose 参考文献 1. 容器与应用之间的关系…