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

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

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

相关文章

Apache Flink文件上传漏洞(CVE-2020-17518)漏洞代码分析

漏洞复现参考如下文章 Apache Flink文件上传漏洞(CVE-2020-17518)漏洞复现分析_文件上传漏洞复现cve-CSDN博客 分析代码的话,首先找到漏洞修复的邮件 漏洞详情,可以看到漏洞概要,影响的版本,漏洞描述以及…

【Linux笔记】文件描述符与重定向

一、Linux关于文件操作的一些系统调用 1、open和close 我们在C语言阶段已经学过很多文件操作的函数,今天我们要来看看操作系统中对于文件是怎么操作的。 1.1、open与close的用法 C语言的库函数中有很多关于文件操作的接口,包括fopen、fclose、fprint…

Docker容器引擎镜像创建

目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统&#xff08…

五大架构之一:系统架构数据流风格

系统架构数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格,它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程,以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff…

redisTemplate.opsForValue()

redisTemplate ​在Spring Data Redis中,redisTemplate 是一个非常重要的组件,它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法,它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…

[文本挖掘和知识发现] 02.命名实体识别之基于BiLSTM-CRF的威胁情报实体识别万字详解

作者于2023年8月新开专栏——《文本挖掘和知识发现》,主要结合Python、大数据分析和人工智能分享文本挖掘、知识图谱、知识发现、图书情报等内容。这些内容也是作者《文本挖掘和知识发现(Python版)》书籍的部分介绍,本书预计2024年…

前端面试题-网络请求-http请求方式-http状态码-url地址到浏览器渲染过程-跨域-请求测试工具-http和https

前端面试题-网络请求-http请求方式-http状态码-url地址到浏览器渲染过程-跨域-请求测试工具 http请求方式http的状态码有哪些?分别代表什么意思?从输入一个url地址到浏览器完成渲染的整个过程解决跨域的三种方式请求测试工具-postman的使用http和https h…

公司人才招聘工作开展难点分析

某国有资本运营公司位于北方某省级城市。在2019年,北方某市的当地政府提出组建专业化国有资本投资运营公司,大力开展专业化资本运营,推动国有资本进退留转市场出清和专业化重组的政策方针。为提高国有资产的管理运营能力,该市成立…

KAFKA高可用架构涉及常用功能整理

KAFKA高可用架构涉及常用功能整理 1. kafka的高可用系统架构和相关组件2. kafka的核心参数2.1 常规配置2.2 特殊优化配置 3. kafka常用命令3.1 常用基础命令3.1.1 创建topic3.1.2 获取集群的topic列表3.1.3 获取集群的topic详情3.1.4 删除集群的topic3.1.5 获取集群的消费组列表…

001集—shapefile(.shp)格式详解——arcgis

一、什么是shapefile Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。shapefile 中的地理要素可通过点、线或面(区域)来表示。包含 shapefile 的工作空间还可以包含 dBASE 表,它们用于存储可连接到 shapefile 的要…

1 月 30 日算法练习-思维和贪心

文章目录 重复字符串翻硬币乘积最大 重复字符串 思路&#xff1a;判断是否能整除&#xff0c;如果不能整除直接退出&#xff0c;能整除每次从每组对应位置中找出出现最多的字母将其他值修改为它&#xff0c;所有修改次数即为答案。 #include<iostream> using namespace …

组件如何组织以提升维护性、扩展性

文章目录 一、提升组件的维护性和扩展性1.1、单一职责原则&#xff08;Single Responsibility Principle&#xff09;1.2、松耦合&#xff08;Loose Coupling&#xff09;1.3、高内聚&#xff08;High Cohesion&#xff09;1.4、模块化设计&#xff08;Modular Design&#xff…

从零开始复现GPT2(三):词表,Tokenizer和语料库的实现

源码地址&#xff1a;https://gitee.com/guojialiang2023/gpt2 GPT2 模型词表TokenizerTokenizer 类_normalize 方法_tokenize 方法_CHINESE_CHAR_RANGE 和 _PUNCTUATION_RANGE 数据集语料库TokenizedCorpus 类 模型 词表 定义了一个名为 Vocab 的类&#xff0c;用于处理和管理…

【项目日记(六)】第二层: 中心缓存的具体实现(下)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:项目日记-高并发内存池⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你做项目   &#x1f51d;&#x1f51d; 开发环境: Visual Studio 2022 项目日…

给准备从事软件开发工作的年轻人的13个建议

从事软件开发是一个不断学习和适应变化的过程。这里有一些针对刚入行或准备从事软件开发工作的年轻人的建议&#xff1a; 掌握基础知识&#xff1a;确保你有扎实的编程基础。了解至少一种编程语言的语法和核心概念&#xff0c;比如C语言、Python、Java或C#。同时&#xff0c;理…

Spring 中获取 Bean 对象的三种方式

目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean&#xff08;好的解决方法&#xff09; 假设 Bean 对象是 User&#xff0c;并存储到 Spring 中&#xff0c;注册到 xml 文件中 public class User {public String sayHi(){retur…

Meta开源Code Llama 70B,缩小与GPT-4之间的技术鸿沟

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

MIT6.5830 实验1

GoDB 介绍 实验中实现的数据库被称为GoDB&#xff0c;根据 readMe1 中的内容可知&#xff0c;GoDB 含有&#xff1a; Structures that represent fields, tuples, and tuple schemas; Methods that apply predicates and conditions to tuples; One or more access methods …

LeetCode 829. 连续整数求和

一开始我想的是质因数分解&#xff0c;然后项数 为奇数的好解决但是偶数弄不了 然后看题解发现了你直接写出通项公式&#xff1a; 假设首项是a&#xff0c;项数为k 则 (ak-1a)*k 2*n 看看k 的范围 2*a 2n/k 1-k>2 2*n/k >k1 2n>k*k 所以可以暴力枚举k sqrt…

Java 开发环境 全套包含IDEA

一、JDK配置 1.下载 JDK Builds from Oracle 去这边下载open JDK 2.JDK环境变量配置 按win&#xff0c;打开设置 找到环境变量编辑 这边输入的是你下载的那个JDK的bin的路径 检擦配置是否正确在cmd中输入 二、IDEA安装配置 1.下载&#xff08;社区版&#xff09; JetBrai…