Django视图层探索:GET/POST请求处理、参数传递与响应方式详解

在这里插入图片描述

系列文章目录

  • Django入门全攻略:从零搭建你的第一个Web项目
  • Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
  • Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
  • Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
  • 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
  • Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
  • 还在写0.0…

文章目录

  • 系列文章目录
  • 前言
  • 一、视图请求
    • 1.1 常见请求方式及特点
    • 1.2 GET请求处理
    • 1.3 POST请求处理
  • 二、前端传参的方式
    • 2.1 查询参数
    • 2.2 路径参数
    • 2.3 请求头参数
    • 2.4 请求体参数
  • 三、GET属性解析参数
  • 四、POST请求处理表单多值提交
  • 五、视图响应
    • 5.1 HttpResponse
    • 5.2 JsonResponse
    • 5.3 HttpResponse与JsonResponse区别总结
    • 5.4 render
    • 5.5 重定向概念及redirect
  • 六、CBV类视图
    • 6.1 FBV、CBV 概念
    • 6.2 CBV路由映射方式
    • 6.3 CBV路由映射原理


前言

     Django框架的视图层是连接用户与服务器逻辑的桥梁。本文将带您领略Django如何处理GET和POST请求、接收前端参数以及返回各种响应的奥秘。我们将探索查询参数路径参数请求头参数请求体参数在请求中的作用,并详细介绍HttpResponseJsonResponserenderredirect等响应方式。此外,我们还将一窥基于类的视图(CBV)的魅力,解析其与URL的映射关系及工作原理。


一、视图请求

1.1 常见请求方式及特点

视图函数一般用来接收一个Web请求HttpRequest,之后返回一个Web响应HttpResponse

视图的组成:

一个视图函数用来响应用户的Request请求,每个视图函数默认第一个位置参数request用来接收用户发起请求的HttpRequest信息。

视图函数的返回值,为一个HttpResponse值,包括我们要返回给用户的HTML页面或者字符串等等,以及对应的头部字段信息

from django.http import HttpResponse
def index(request):
        return HttpResponse('Hello world')

get 和 post:

POST和GET是HTTP协议定义的与服务器交互的方法。

  • GET一般用于获取/查询资源信息
  • POST一般用于更新资源信息
  • PUT 一般用于修改数据
  • DELETE一般用户删除数据

1.2 GET请求处理

常用来从指定地址请求数据;如果需要在请求时提交某些数据,则以路由形式传递参数,查询Query字符串如下格式所示:https://www.baidu.com/?key=abc&pos=shanxi

  • get用于获取数据
  • get请求可被浏览器缓存,保存在历史记录中
  • get不应在使用敏感数据时使用,明文暴露在请求地址中
  • get有长度限制

1.3 POST请求处理

向指定的资源提交要被处理的数据;使用POST,提交的数据保存在HTTP协议中的消息主体部分

  • post用于提交数据
  • post请求不会被浏览器缓存
  • post提交数据长度无限制
  • postget更加安全

二、前端传参的方式

2.1 查询参数

通过在路径后面添加 来拼接参数,如果有更多参数,使用 & 符号拼接

示例:
单个参数:http://127.0.0.1:8000/?name='zs' 
多个参数:http://127.0.0.1:8000/?name=zs&age=18&height=1.78

后端获取参数方式:

视图中:request.GET 方法来获取所有传递数据,返回的结果是:querydict。
获取参数方式:
单个参数获取:querydict.get('key')
列表参数获取:querydict.getlist('key')

2.2 路径参数

请求参数直接跟在请求路径后的方式叫做路径参数

示例:
http://127.0.0.1:8000/3/ 
上面的3表示需要传递的数据,就是路径参数,类型是int类型,也可以是str类型

路由配置:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/<int:number>',views.index)
]
此处int为类型,number为参数名

视图中获取路径参数:

在视图request请求参数后,添加需要接收的参数,此处的参数就是路径中配置的参数名
def index(request, number):
    print(number)
    pass

另外,不仅可以使用path路由配置,还可以使用re_path来配置自定义正则规则的路由

re_path(r'^login/(1[3-9]\d{9})/$',login)
正则匹配手机号,请求地址后需要携带手机号规则的参数

2.3 请求头参数

# 获取请求头信息 request.META 
request.META ==> dict 
request.META.get('HTTP_KEY')
注意的是header key必须增加前缀HTTP,同时大写,
例如你的key为username,那么应该写成:request.META.get("HTTP_USERNAME")

2.4 请求体参数

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求⽅式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求⽅式进⾏CSRF防护验证,在测试时可以关闭CSRF防护机制,⽅法为在settings.py⽂件中注释掉CSRF中间件

跨域问题参考:跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护

表单参数Form Data:
数据获取:request.POST.get('key')

非表单参数:

传递格式:json格式:'{"name":"张三","age":19}'
接收方式:数据包含在请求体中

def index(request):
	print(request.body)
    #将字节数据解码成json格式的字符串
    data = request.body.decode()
    # 打印数据
    print(data) #纯字符串
    # 通过json.loads将字符串转为字典格式的数据
    dict_data = json.loads(data)
    # 打印转换完以后数据
    print(dict_data)
    print(dict_data.get('name'))
    return HttpResponse("响应数据")

三、GET属性解析参数

def index(request):
    print(request.GET) # <QueryDict: {'name': ['jack'], 'id': ['1']}>
    print(type(request.GET)) # <class 'django.http.request.QueryDict'>
    name_ = request.GET.get('name')
    id_ = request.GET.get('id')
    content = '%s:%s' % (name_,id_)
    return HttpResponse(content)

传参:

http://127.0.0.1:8000/?name=jack&id=1

结果:

jack:1

四、POST请求处理表单多值提交

# 单选 radio 时 或者 使用选择框 select 时
request.POST.get(key, default=None)
# 返回对应 key 值的数据中的最后一个数据单独返回;key 值不存在,取 default

#真正拿出复选框checkbox提交的所有结果,应该使用`getlist`函数
request.POST.getlist(key, default=None)
# 将对应 key 值的所有数据以一个列表形式返回;key 值不存在,取 default


五、视图响应

5.1 HttpResponse

HttpResponse:返回json格式的字符串、任意类型的数据

响应的几种类型:

1、将字符串或者html格式数据进行响应:

from django.http import HttpResponse
HttpResponse(content=b'', status='状态码 int', content_type='内容类型 text/html')

# content_type 学名: MIME类型-- 互联网传输文件的类型
# 类属性 status_code

将字符串或者html格式数据进行响应
res = HttResponse('hello world!', status=200, content_type="text/html")
res.status_code = 300
return res 

2、也可以构建json格式的数据进行响应(最常用):

json_str = """
{
  "name":"json_data",
   "age":18
}
"""
res = HttpResponse(json_str, status=200, content_type="application/json")
return res

3、构建文件类型作为响应:测试使用,真是开发中,不建议如下使用,以下代码只做测试使用

from django.contrib.staticfiles import finders
def responseview(request):
    image_path = finders.find('img/shanhe.png')
    print('图片地址',image_path)
    with open(image_path, 'rb') as img_file:
        image_data = img_file.read()
    # 设置响应内容类型和状态码
    response = HttpResponse(image_data, content_type="image/png")
    response.status_code = 200
    return response

5.2 JsonResponse

JsonResponse:将python中的字典或者列表类型数据,转成json格式的字符串并返回

from django.http import JsonResponse
res = JsonResponse({'a':1, 'b':2})

# 返回一个Json字符串
1.dict --转换json字符串
2. content_type="application/json"

5.3 HttpResponse与JsonResponse区别总结

  1. 用途HttpResponse用于构建任何类型的HTTP响应,而JsonResponse专门用于构建JSON格式的响应。
  2. 内容类型:使用HttpResponse时,你需要手动设置content_type。而JsonResponse则默认将content_type设置为"application/json"
  3. 数据序列化HttpResponse不会处理数据的序列化,你需要提供已经格式化好的数据。而JsonResponse会自动将Python对象(如字典或列表)序列化为JSON格式。
  4. 易用性:对于返回JSON数据来说,JsonResponseHttpResponse更加方便和易用,因为它减少了手动设置响应格式和编码的需求。

在大多数情况下,当你需要返回JSON格式的数据时,应该优先考虑使用JsonResponse。如果你需要返回其他类型的内容,比如HTML或纯文本,那么应该使用HttpResponse

5.4 render

在Django中,render()函数是用于渲染视图的常用方法。它能够将模板和上下文数据结合在一起,生成最终的HTML响应。

from django.shortcuts import render
render(request,template_name,context=None,content_type=None,status=None)
# 返回一个可渲染 HTML 页面,状态码为 200
'''
request: 固定参数,响应的 request 请求,来自于参数部分接收的 HttpRequest
template_name: 返回的模板页面路径
context: 模板页面渲染所需的数据,默认为字典格式
content_type: 生成之后的结果使用的 MIME 类型
status: 响应的状态码,默认为 200
'''

5.5 重定向概念及redirect

重定向分为永久重定向临时重定向,当浏览器访问的时候,是否重新定向到新的资源地址。

  • 永久重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
  • 临时重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。

在Django中,重定向是使用redirect(to, *args, permanent=False, **kwargs)来实现的。

  • to是一个url地址,
  • permanent默认是False代表临时重定向,设置为True代表永久重定向。
from django.shortcuts import redirect 
redirect(to, permanent=False)
# 一个重定向,浏览器通过该状态码自动跳转到一个新的路由地址,默认返回响应状态码 302
'''
to # 可以是一个 django 项目中视图函数的路由映射,也可以是一个 reverse 的反向路由解析
permanent # 如果设置为 True,将返回 301 状态码,代表永久重定向
'''
302:临时重定向,旧地址资源临时不能用了,搜索引擎只会暂时抓取新地址的内容而保存旧的地址。
301:永久重定向,旧地址资源已经不复存在,搜索引擎不光会抓取新地址的内容,还会替换旧地址为新地址

六、CBV类视图

6.1 FBV、CBV 概念

FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数,需要在视图函数内通过reqeust.methed来获取对应请求类型,进而进行请求类型的判断。

CBV(class based views) 就是在视图里使用类处理请求

django中还提供了一种方式叫做CBV,在类中编写视图功能, 并且将传统的getpost判断设置为了类中函数,这样当用户发起不同的请求,会自动进入到对应的类中函数上,像是下面这样:

from django.views import View
class ArticleView(View):
    def get(self,request):
        raise Http404
    def post(self,request):
        if request.is_ajax():
            id_ = request.POST.get('id_')
            result = models.Article.objects.get(id=id_).content
            data = result.replace('\r\n','<br>') 
            return HttpResponse(json.dumps(data,ensure_ascii=False) )
        raise Http404

6.2 CBV路由映射方式

路由映射配置:path('article/',ajaxviews.ArticleView.as_view())

  • 路由设置时,需要使用试图类的ArticleView.as_view()函数进行实例化,和以前FBV有区别
  • 此外,类中函数名(请求方式)必须为小写

6.3 CBV路由映射原理

用户访问时,会经由View基类中的as_view -> dispatch进行判断,通过请求类型分发到不同对应请求的函数名下;也就是通过get方式访问,那么对应会调用到名为get的函数

通过将请求类型定义为函数,可以更加方便进行请求方式判断

在这里插入图片描述

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

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

相关文章

LeetCode刷题之HOT100之字母异位词分组

中午没有回宿舍午休&#xff0c;每次回去都没睡着&#xff0c;我想就没有必要回去了。京东买的书今天还没到&#xff0c;提前把题做了好专心做开发任务。 1、题目描述 2、逻辑分析 我看了几分钟&#xff0c;有点理解不了这道题需求是什么。看看题解。看了才理解题目的意思。字…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列&#xff0c;即固定长度的队列&#xff0c;可以想象成一个环形队列 就类似于这种队列&#xff0c;队尾指针后会有一个空位&#xff0c;用于控制判断队列为空还是为满&#xff1b; typedef int MyDataType;typedef struct {MyDataType fron…

弘君资本炒股开户:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关心的话题之一&#xff0c;面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇&#xff0c;弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态&#xff0c;股市是国民经济的晴雨表&#xff0c;股票价格…

03数据卷及其挂载的命令

数据卷(虚拟目录)操作命令 在容器内部修改文件 docker exec -it nginx bash: 进入Nginx容器内部 docker exec: 进入容器内部,容器内部会模拟一份阉割版的Linux文件系统,只包含镜像运行时所需的环境和配置以及文件-it: 给当前进入的容器创建一个标准输入/输出终端方便我们与容…

浏览器阻止屏幕息屏,js阻止浏览器息屏,Web网页阻止息屏

场景: 比如打开一个浏览器页面(比如大屏),想让它一直显示着,而不是过几分钟不操作就屏幕黑了.(电脑有设置电脑不操作就会多长时间就会息屏睡眠,如果要求每个客户都去操作一下电脑设置一下从不睡眠,这很不友好和现实.而且我也只想客户在大屏的时候才这样,其他页面就正常,按电脑设…

HTTPS缺失?如何轻松解决IP地址访问时的“不安全”警告

一、问题现象 如果访问网站时出现以下任何一种情况&#xff0c;则说明该网站需要立即整改&#xff1a; 1.浏览器地址栏那里出现“不安全”字样&#xff1b; 2.小锁标志被红叉&#xff08;&#xff09;、斜线&#xff08;&#xff3c;&#xff09;等标志为不可用&#xff1b;…

二叉树的链式结构(二叉树)与顺序结构(堆)---数据结构

一、树的概念与结构 1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。我们常把它叫做树&#xff0c;是因为它看起来像一棵倒挂的树&#xff0c;它的根是朝上的&#xff0c;而叶是朝下的。 下面…

国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上Vim的详解03–使用Vundle插件管理器来安装和使用插件 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用Vundle插件管理器来安装和使用Vim插件的详解文章。Vundle是Vim的一款强大的插…

【GD32H757Z海棠派使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

11.1 实验内容 通过本实验主要学习以下内容&#xff1a; SPI简介 GD32H7 SPI简介 SPI NOR FLASH——GD25Q128ESIGR简介 使用GD32H7 SPI接口实现对GD25Q128ESIGR的读写操作 11.2 实验原理 11.2.1 SPI简介 SPI&#xff08;Serial Peripheral interface&#xff09;&#…

Oracle和mysql中插入时间字段

例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中&#xff0c;SYSDATE() 函数也是可用的&#xff0c;它与 NOW() 类似&#xff0c;但略有不同&#xff1a; NOW…

pdf文件怎么合并成一个文件

在现代办公环境中&#xff0c;PDF文件的使用已变得非常普遍。它们具有跨平台、易读性强的特点&#xff0c;因此被广泛应用于各种场合。然而&#xff0c;当需要处理大量的PDF文件时&#xff0c;如何有效地将它们合并成一个文件&#xff0c;成为了一个需要解决的问题。本文将详细…

STM 32_HAL_SDIO_SD卡

STM32的SDIO&#xff08;Secure Digital Input Output&#xff09; 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信&#xff0c;支持多媒体卡&#xff08;MMC卡&#xff09;、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…

High School Math 2003

高中数学2003&#xff0c;离我远去&#xff0c;有些已经忘记了 2个小时。选择题和填空题答题时间2-4分钟。基础题、应用题大题为10分钟左右&#xff0c;不然肯定就是没时间做完&#xff0c;数学就是考察就是2小时单位时间内完成数量和质量&#xff08;正确率&#xff09;&#…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

真正用AI大模型的人,美国7%,日本1%,中国垫底

AI真实渗透率完整版大揭秘&#xff01;谁能告诉我&#xff0c;为何用的人寥寥无几&#xff1f; ✨ 结论&#xff1a;真正用AI的人&#xff0c;美国7%&#xff0c;日本1%&#xff0c;中国垫底。 &#x1f50d; 你是否以为AI早已无处不在&#xff1f;无所不能&#xff1f;可现实…

国内外低代码平台有哪些 6大热门国内外低代码厂商介绍

低代码开发平台是一种新兴的开发工具&#xff0c;它允许用户通过图形化界面和拖放操作来创建应用程序&#xff0c;而无需编写大量的代码。这种平台的优势在于能够大幅提高开发效率&#xff0c;降低企业成本&#xff0c;并让非技术人员也能够参与到应用开发过程中来。 国内低代码…

WEB攻防- Javascript项目特性- Node.js框架安全-识别审计-验证绕过

1、什么是JS渗透测试&#xff1f; 在Javascript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可能存在参数漏洞 JS开发的WEB应用和PHP&#xff0c;JAVA,NET等区别在于即使没有源代码&#xff0c;也可以通过浏览器的查看源代码获取真实的点。所以相当于JS开发的WEB…

模块搜索目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 当使用import语句导入模块时&#xff0c;默认情况下&#xff0c;会按照以下顺序进行查找。 &#xff08;1&#xff09;在当前目录&#xff08;即执行…

RHCE (Linux进阶) Ubuntu 操作系统安装教程

一、在官网下载iso镜像文件 下载地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下载最新的Ubuntu 20.04 LTS服务器版本&#xff09; 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…