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请求、接收前端参数以及返回各种响应的奥秘。我们将探索查询参数、路径参数、请求头参数和请求体参数在请求中的作用,并详细介绍HttpResponse、JsonResponse、render和redirect等响应方式。此外,我们还将一窥基于类的视图(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提交数据长度无限制post比get更加安全
二、前端传参的方式
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 = 200return 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区别总结
- 用途:
HttpResponse用于构建任何类型的HTTP响应,而JsonResponse专门用于构建JSON格式的响应。 - 内容类型:使用
HttpResponse时,你需要手动设置content_type。而JsonResponse则默认将content_type设置为"application/json"。 - 数据序列化:
HttpResponse不会处理数据的序列化,你需要提供已经格式化好的数据。而JsonResponse会自动将Python对象(如字典或列表)序列化为JSON格式。 - 易用性:对于返回JSON数据来说,
JsonResponse比HttpResponse更加方便和易用,因为它减少了手动设置响应格式和编码的需求。
在大多数情况下,当你需要返回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,在类中编写视图功能, 并且将传统的get、post判断设置为了类中函数,这样当用户发起不同的请求,会自动进入到对应的类中函数上,像是下面这样:
from django.views import View
class ArticleView(View):def get(self,request):raise Http404def post(self,request):if request.is_ajax():id_ = request.POST.get('id_')result = models.Article.objects.get(id=id_).contentdata = 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的函数
通过将请求类型定义为函数,可以更加方便进行请求方式判断

相关文章:
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
磁盘配额的具体操作
磁盘配额: linux的磁盘空间有两个方面:第一个是物理空间,也就是磁盘的容量 第二个inode号耗尽,也无法写入 linux根分区:根分区的空间完全耗尽,服务程序崩溃,系统也无法启动了。 为了防止有人…...
STM 32_HAL_SDIO_SD卡
STM32的SDIO(Secure Digital Input Output) 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信,支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…...
人脸识别系统之动态人脸识别
二.动态人脸识别 1.摄像头人脸识别 1.1.导入资源包 import dlib import cv2 import face_recognition from PIL import Image, ImageTk import tkinter as tk import os注:这些导入语句允许您在代码中使用这些库和模块提供的功能,例如创建…...
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
文章目录 背景代码 背景 如果我们想要根据json标注文件,获取里面的指定目标的裁剪区域,那么我们可以根据以下代码来实现(也可以校验标注情况)。 代码 from tqdm import tqdm import os, json, cv2, copy import numpy as npdef…...
LabVIEW在高校电力电子实验中的应用
概述:本文介绍了如何利用LabVIEW优化高校电力电子实验,通过图形化编程实现参数调节、实时数据监控与存储,并与Simulink联动,提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时,通常使用…...
rtsp python实现
1. rtsp rtp rtcp https://hope-wisdom.blog.csdn.net/article/details/138259027 2.rtsp加速 https://mp.weixin.qq.com/s/0C1b-8pFw0HaE1xpNbrxxw 3. 实现了一部分获取数据 import socket import base64 import threading import struct# 定义 RTSP 请求 def send_rtsp_…...
RHCE (Linux进阶) Ubuntu 操作系统安装教程
一、在官网下载iso镜像文件 下载地址: https://cn.ubuntu.com/download/server/step1#downloads(下载最新的Ubuntu 20.04 LTS服务器版本) 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…...
vue-router 源码分析——1. 路由匹配
这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行: 按官网的使用文档顺序,围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码,更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升,甚至面试时…...
百度云下载不限速方式集合
使用解析网站配合Motrix工具软件 下载Motrix工具:Motrix下载链接打开解析网址:解析网站获取,将百度网盘链接粘贴到解析网站,获取下载链接。在Motrix中配置Aria2 RPC地址:ws://localhost:16800/jsonrpc开始下载&#x…...
2024年6月1日 (周六) 叶子游戏新闻
Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时,他们对游戏大作的价格上涨做出了评论。几年来,游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示,电子游戏行业…...
MathorCup挑战赛获奖名单公示,第九届研讨会及颁奖典礼即将举行
近日,备受瞩目的2024年第十四届MathorCup高校数学建模挑战赛圆满落幕,竞赛组委会于近日公示了获奖名单初稿。本届竞赛自2024年4月12日至16日举行,吸引了来自全国740所高校的9119支队伍踊跃参与,其中包括本科生、研究生、专科生及教…...
vulnhub靶机xptosystem
下载地址:https://download.vulnhub.com/xpto/xptosystem.ova 主机发现 端口扫描 服务扫描 漏洞扫描 看一下web 目录爆破 那不用说肯定看看robots.txt 要检查readme去看看 看不懂 这个是靶场吧很像 在最后看着挺像url路径的 还真是,我直接base64 坏了还…...
Spring Boot详解:深入了解与实践
文章目录 1. Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…...
FreeRtos进阶——中断的内部逻辑
中断与非中断API的区别 BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait); BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWok…...
Centos7对比Ubuntu一些常用操作差异点
Centos7对比Ubuntu一些常用操作差异点 CentOS 7将于2024年6月30日停止维护,CentOS8已经转为Rhel的上游项目。同时Centos7的软件仓库中,部分软件版本较老。后续使用过程中可以考虑切换到Ubuntu。 下面总结了一些两个系统的常见差异点,包括软…...
24、matlab二维和三维网格(meshgrid函数)以及散点数据插值 griddata()函数
1、二维和三维网格(meshgrid函数) 语法 语法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。 语法2:[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)length(x) 的方形网格坐标。 语法3:[X,Y,Z] = meshgrid(x,y,…...
Codeforces Round 950 (Div. 3)
好久没写题解了,今天来写个题解。 A - 问题 Generator #include "bits/stdc.h" using namespace std;#define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0); #define all(x) x.begin(),x.end() #define pi pair<in…...
弘君资本炒股开户:如何看待股价波动?
在股票商场上股价的动摇无疑是投资者最为关心的话题之一,面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇,弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态,股市是国民经济的晴雨表,股票价格…...
操作系统实验六 文件系统验证实验
前言 当时由于假期的原因,我们不需要做实验五,所以实验六是我们做的最后一个实验,因此实验五就需要靠大家自己完成了。 1.实验目的 初步掌握Linux系统文件权限和IO操作。 2.实验内容 熟悉Linux系统文件权限和使用相关IO函数进行文件创建和…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
