当前位置: 首页 > news >正文

Django视图

HttpRequests对象

利用http协议向服务器传参的4种途径

  • 提取url特定部分,如/web/index/,可以通过在服务器端的路由中用正则表达式截取
  • 查询字符串,形如?key1=value&key=value2,(?前面是路由,后面是字符串
  • 在请求体(body)中发送数据,比如表单数据json、xml
  • 在http报文的头(header)中

url路径参数

如果想从url中获取参数值,例如:http://127.0.0.1/index/file

更改路由匹配为占位符,用来接收请求中的参数

urlpatterns = [path('<path_name>/<file_name>/',index ),
]

视图中函数:参数的位置不能错

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request,path_name,file_name):return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

 图解

查询字符串 

http://ip/path/path?key=value&key=value

url以?分割为两部分。?前面是请求路径,后边是查询字符串,类似于字典多个值用&拼接

可以使用request.GET来获取,返回的是一个QueryDict字典,这个字典和python中的字典不同。

这个字典可以一键多值,但是也可以使用python字典的方法来处理

使用字典的get方法获取字典键的值

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request,path_name,file_name):query_str=request.GETdata1=query_str.get("key1")data2=query_str.get("key2")print(query_str)print(data1)print(data2)"""<QueryDict: {'key1': ['file_name'], 'key2': ['file_type']}>file_namefile_type"""return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

使用字典getlist方法获取一个键的多个值返回一个列表

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request,path_name,file_name):query_str=request.GETdata_list=query_str.getlist("key1")print(query_str)print(data_list)"""<QueryDict: {'key1': ['file_name', 'file_path'], 'key2': ['file_type']}>['file_name', 'file_path']"""return HttpResponse("请求的资源路径是/%s/%s"%(path_name,file_name))

在请求体中发送数据 

传递from表单数据

使用postman发送一个post请求,发现状态码是403,django默认是对post请求验证的

下面修改setting.py中的配置代码,跳过对post请求的验证

使用POST方法接收请求体中的参数 

json数据请求和接收 

使用postman发送json数据

使用body方法来接收json数据,接收到的数据是二进制的,需要转成字符串然后再使用json的loads方法转成puthon中的字典

 将字符串转换成字典

请求头 

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型

其他的HttpsRequest对象属性

  • method:一个字符串,表示请求使用的HTTP方法,常用值包括“GET”、"POST"
  • user:请求的用户对象
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分
  • encoding:一个字符串,表示提交的数据的编码方式
    • 如果为None表示使用浏览器的默认设置,一般为utf-8
    • 属性值是可以更改的,可以通过修改它来修改访问表单数据使用的编码
  • FILES:一个类似于字典的对象,包含所有的上传文件

转换器

作用:验证请求路径中的参数

  • 在视图函数中添加判断验证(代码复用低)
  • 转换器(代码复用高)

自定义一个转换器

from django.urls import path
from test_apps.views import index,registerfrom django.urls.converters import register_converter# 定义转换器
class PhoneConverter:regex = '1[3-9]\d{9}'# 验证没有问题的数据,给视图函数def to_python(self, value):return int(value)# def to_url(self, value):#     return str(value)# 注册转换器
# def register_converter(converter, type_name):
# converter  转换器类
# type_name   转换器的名字register_converter(PhoneConverter,"phone")# 使用转换器
urlpatterns = [path('<int:path_name>/<phone:phone_num>/',index ),path('register',register),# path('json',json)
]

自定义一个转换器实现对手机号的验证

定义转换器

# 定义转换器
class PhoneConverter:regex = '1[3-9]\d{9}'# 验证没有问题的数据,给视图函数def to_python(self, value):return int(value)# def to_url(self, value):#     return str(value)

注册转换器

from django.urls.converters import register_converter
# 注册转换器
# def register_converter(converter, type_name):
# converter  转换器类
# type_name   转换器的名字register_converter(PhoneConverter,"phone")

使用转换器

# 使用转换器
urlpatterns = [path('<int:path_name>/<phone:phone_num>/',index ),path('register',register),# path('json',json)
]

HttpResponse对象

使用django.htrtp.HttpResponse来构造响应对象

HttpResponse(content=响应体,content_type=响应体数据类型,status=状态码)

响应状态码

分类 

状态码分类说明
1XX响应中--临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
2XX成功--表示请求已经被成功接受,处理已完成
3XX重定向--重定向到其他地方(让客户端再发起一个请求以完成整个处理)
4XX客户端错误--处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5XX服务器端错误--处理发生错误,责任在服务器端,如:服务端抛出异常,路由出错,HTTP版本不支持等

常见状态码

状态码英文描述解释
200OK客户端请求成功,即处理成功
302Found只是所请求的资源已移动到由Location响应头给定的URL,浏览器会自动重新访问到这个页面
304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400Bad Request客户端请求有语法错误,不能被服务器所理解
403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
428Precondition Required服务器要求有条件的请求,告诉客户端要想访问资源,必须携带特定的请求头
429Too Many Requests太多请求,可以限制客户端请求某个资源的数量,配合Retry-After(多长时间后可以请求)响应头一起使用
431Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后提交
405Method Not Allowed请求方式有误,比如:应该用GET请求方式的资源,而用了POST
500Internal Server Error服务器发生不可预期的错误,表示服务器出异常了
503Service Unavailable服务器尚未准备好处理请求,比如:服务器刚刚启动,还未初始化好
511

Network Authentication Required

客户端需要进行身份验证才能获得网络访问权限

响应头可以直接将HttpResponse对象当作字典进行响应头键值对的设置

response=HttpResponse()
# 自定义响应头name,值为python
respone["name"]="python"

JsonrResponse

 将字典直接转换成json字符串

def json_response(request):info={"name":"小明","age":18}return JsonResponse(data=info)

 将其他类型的数据转换成json字符串

def json_response(request):info=[{"name": "小明","age": 18},{"name":"王刚","age":20}]return JsonResponse(data=info,safe=False)

重定向

from django.shortcuts import redirect
def redirects(request):return redirect("http://www.baidu.com")

状态保持

  • cookie:客户端存储信息
  • session:服务端存储信息

cookie

  • cookie以键值对的格式进行信息的存储
  • cookie基于域名安全,不同域名的cookie是不能互相访问的
  • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有cookie信息提交给网站服务器


"""
第一次请求,携带查询字符串
服务器收到请求之后,获取username,服务器设置cookie信息,cookie信息包括username
浏览器接收到服务器的响应后,应该把cookie保存起来第二次及其以后的请求,都会携带cookie信息,服务器就可以读取cookie信息,用来判断用户身份
"""
def set_cookie(request):# 查询字符串数据name=request.GET.get("username")# 服务器设置cookie信息# 通过响应对象.set_cookie方法response=HttpResponse("name")# .set_cookie方法将数据存放在本地cookie中,通过.COOKIES获取response.set_cookie("name",name)return responsedef get_cookie(request):# {'name': 'xiaoming'},requset.COOKIES返回的是一个字典数据name=request.COOKIES.get("name")# 将数据直接返回return HttpResponse(name)

设置cookie到期时间

# max_age= 是一个秒数,从响应开始计数的一个秒数    
response.set_cookie("name",name,max_age=60*60)

删除cookie 

# 原理是将cookie有效期设置为0
request.delete_cookie("name")

session 

修改数据库中的sessionid,浏览器将找不到数据。

通过resquest.session的方式设置session

  • session保存在服务器
  • session需要依赖于cookie
  • session存储于数据库中

 设置一个session

"""
第一次请求服务器端设置session信息
服务器同时会生成一个sessionid的cookie的信息
浏览器接收到这个信息后会把cookie数据保存起来第二次及其以后的请求,都会携带这个sessionid,服务器会验证这个sessionid
验证没有问题会读取相关数据,实现业务逻辑
"""
def set_session(request):# 1、获取用户信息name=request.GET.get("username")# 2、设置session信息request.session["username"]=namereturn HttpResponse("set_session")

数据库中会被添加一条数据 

 获取session 

def get_session(request):name=request.session.get("username")psw=request.session.get("password")content="{},{}".format(name,psw)return HttpResponse(content)

session 保存到redis(具体使用参考官方文档)

安装扩展

pip install django-redis

在settings.py配置redis做session存储

# cache缓存
CACHES={# 默认配置'default':{# 使用redis类实现缓存'BACKEND':'django_redis.cache.RedisCache','LOCATION':'redis://127.0.0.1:6379/1', # 主机端口和库'OPTIONS':{'CLIENT_CLASS':'django_redis.client.DefaultClient',# 设置客户端}}
}
# 服务引擎,使用缓存
SESSION_ENGINE='django.contrib.sessions.backends.cache'
# 指定缓存配置信息
SESSION_CACHE_ALIAS='default'

session过期与删除

清除所有session,在存储中的值部分

request.session.clear()

清除session数据,在存储中删除session的整条数据

request.session.flush()

删除session中的指定键值,在存储中只删除某个键及对应值

del request.session['键']

设置session的有效期

  • 如果value是一个整数,session将在value秒没有活动后过期
  • 如果value为0,那么用户session的cookie将在用户的浏览器关闭时过期
  • 如果valu为None,那么session有效期将采用系统默认值,默认为两周,可以通过settings.py中设置SESSION_COOKIE_AGE来设置全局默认值
request.session.set_expiry(value)

类试图


"""
类试图的定义class 类试图名字(View):def get(self,requset):return HttpResponse('xxx')def http_method_lower(self,request):return HttpResponse('xxx')
"""
from django.views import View
class My_View(View):def get(self,requset):return HttpResponse('get get get ')def post(self,request):return HttpResponse('post post post')

中间件

django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改django的输入输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了django框架的健壮性。

定义一个中间件

必须继承自MiddlewareMixin

from django.utils.deprecation import MiddlewareMixinclass TestMiddleware(MiddlewareMixin):def process_request(self,request):print("每次请求前调用")def process_response(self,request,response):print("每次响应前调用")return response

注册中间件 

修改settings.py文件中的MIDDLEWARE

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','test_apps.middleware.TestMiddleware',
]

多个中间件的执行顺序

  • 在请求视图被处理前,中间件由上至下依次执行
  • 在请求视图被处理后,中间件由下至上依次执行

相关文章:

Django视图

HttpRequests对象 利用http协议向服务器传参的4种途径 提取url特定部分&#xff0c;如/web/index/&#xff0c;可以通过在服务器端的路由中用正则表达式截取查询字符串&#xff0c;形如?key1value&keyvalue2&#xff0c;&#xff08;&#xff1f;前面是路由&#xff0c;…...

python基本语法

变量无需声明 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量&#xff0c;它没有类型&#xff0c;我们所说的"类型"是变量所指的内存中对象的类型。 len800 #整型变…...

app逆向-⽹络请求库rxjava2

文章目录 一、前言二、安装三、GET请求实现四、POST请求实现 一、前言 RxJava 2 是一个流行的 Java 库&#xff0c;用于使用可观察序列组合异步和基于事件的程序。它是原始 RxJava 库的重新实现&#xff0c;旨在更高效并且更适合于 Java 8 及更高版本。 RxJava 2 的主要特性包…...

Spring Boot 笔记 007 创建接口_登录

1.1 登录接口需求 1.2 JWT令牌 1.2.1 JWT原理 1.2.2 引入JWT坐标 1.2.3 单元测试 1.2.3.1 引入springboot单元测试坐标 1.2.3.2 在单元测试文件夹中创建测试类 1.2.3.3 运行测试类中的生成和解析方法 package com.geji;import com.auth0.jwt.JWT; import com.auth0.jwt.JWTV…...

java数据结构与算法刷题-----LeetCode594. 最长和谐子序列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 子序列要尽可能长&#xff0c;并且最大值和最小值之间的差&#…...

数据分析基础之《pandas(6)—高级处理》

一、缺失值处理 1、如何处理nan 两种思路&#xff1a; &#xff08;1&#xff09;如果样本量很大&#xff0c;可以删除含有缺失值的样本 &#xff08;2&#xff09;如果要珍惜每一个样本&#xff0c;可以替换/插补&#xff08;计算平均值或中位数&#xff09; 2、判断数据是否…...

IOS破解软件安装教程

对于很多iOS用户而言&#xff0c;获取软件的途径显得较为单一&#xff0c;必须通过App Store进行下载安装。 这样的限制&#xff0c;时常让人羡慕安卓系统那些自由下载各类版本软件的便捷。 心中不禁生出疑问&#xff1a;难道iOS世界里&#xff0c;就不存在所谓的“破解版”软件…...

[缓存] - 1.缓存共性问题

1. 缓存的作用 为什么需要缓存呢&#xff1f;缓存主要解决两个问题&#xff0c;一个是提高应用程序的性能&#xff0c;降低请求响应的延时&#xff1b;一个是提高应用程序的并发性。 1.1 高并发 一般来说&#xff0c; 如果 10Wqps&#xff0c;或者20Wqps &#xff0c;可使用分布…...

Python爬虫——解析库安装(1)

目录 1.lxml安装2.Beautiful Soup安装3.pyquery 的安装 我创建了一个社区&#xff0c;欢迎大家一起学习交流。社区名称&#xff1a;Spider学习交流 注&#xff1a;该系列教程已经默认用户安装了Pycharm和Anaconda&#xff0c;未安装的可以参考我之前的博客有将如何安装。同时默…...

中科大计网学习记录笔记(十一):CDN

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…...

[缓存] - 2.分布式缓存重磅中间件 Redis

1. 高性能 尽量使用短key 不要存过大的数据 避免使用keys *&#xff1a;使用SCAN,来代替 在存到Redis之前压缩数据 设置 key 有效期 选择回收策略(maxmemory-policy) 减少不必要的连接 限制redis的内存大小&#xff08;防止swap&#xff0c;OOM&#xff09; slowLog …...

1191. 家谱树(拓扑排序,模板题)

活动 - AcWing 有个人的家族很大&#xff0c;辈分关系很混乱&#xff0c;请你帮整理一下这种关系。 给出每个人的孩子的信息。 输出一个序列&#xff0c;使得每个人的孩子都比那个人后列出。 输入格式 第 11 行一个整数 n&#xff0c;表示家族的人数&#xff1b; 接下来 …...

CSS之BFC

BFC概念 BFC&#xff08;Block Formatting Context&#xff09;即块级格式化上下文&#xff0c;是Web页面的可视CSS渲染的一部分。它是一个独立的渲染区域&#xff0c;让其中的元素在布局上与外部的元素互不影响。简单来说&#xff0c;BFC提供了一个环境&#xff0c;允许内部的…...

2024 年合并 PDF 文件的免费 PDF 合并软件榜单

合并 PDF 是当今人们寻找的最重要的功能之一。在本文中&#xff0c;您将了解前五名的 PDF 合并软件以及详细的介绍&#xff0c;以便您选择最佳的。如果您想将所有重要信息都放在一个文件中&#xff0c;而不是在不同的文件中查找&#xff0c;那么合并 PDF 文件是必要的。通过这种…...

Python教程56:海龟画图turtle画kitty猫

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python教程51&#xff1a;海龟画图turtle画&#xff08;三角形、正方形、五边形、六边形、圆、同心圆、边切圆&#xff0c;五角星&#xff0c;椭…...

c入门第十篇——指针入门

一句话来说: 指针就是存储了内存地址值的变量。 在前面讨论传值和传址的时候&#xff0c;我们就已经开始使用了指针来传递地址。 在正式介绍指针之前&#xff0c;我们先来简单了解一下内存。内存可以简单的理解为一排连续的房子的街道&#xff0c;每个房子都有自己的地址&#…...

pwn学习笔记(3)ret2syscall

pwn学习笔记&#xff08;3&#xff09; ROP原理&#xff1a; ​ ROP(Return Oriented Programming)返回导向编程&#xff0c;主要思想是通过在程序中已有的小片段&#xff08;gadgets&#xff09;来改变某些寄存器或者变量的值&#xff0c;从而控制程序的执行流程。 栈溢出–…...

React18原理: 生命周期中特别注意事项

概述 生命周期就是一个组件从诞生到销毁的全过程(包含错误捕获&#xff0c;这里暂且不聊这个)react 在组件的生命周期中注册了一系列的钩子函数支持开发者在其中嵌入代码&#xff0c;并在适当的时机运行生命周期本质上就是组件中的钩子函数&#xff0c;主要有三个主要的钩子 挂…...

【C语言】Linux内核bind系统调用代码

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…...

Ubuntu下Anaconda+PyCharm搭建PyTorch环境

这里主要介绍在condapytorch都正确安装的前提下&#xff0c;如何通过pycharm建立开发环境&#xff1b; Ubuntu下AnacondaPyCharm搭建PyTorch环境 系统环境&#xff1a;Ubuntu22.04 conda: conda 23.11.0 pycharm:如下 condapytorch的安装教程介绍&#xff0c;请点击这里&…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...