当前位置: 首页 > 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;请点击这里&…...

LongCat-Image-Editn效果展示:建筑效果图‘添加中文标牌+调整光照’案例

LongCat-Image-Edit效果展示&#xff1a;建筑效果图‘添加中文标牌调整光照’案例 1. 开篇&#xff1a;当AI学会“装修”建筑效果图 想象一下&#xff0c;你手里有一张刚出炉的建筑效果图&#xff0c;客户突然提出两个新需求&#xff1a;“能不能给大楼加上我们公司的中文招牌…...

Xinference-v1.17.1优化技巧:如何提升模型加载速度和推理性能,节省硬件资源

Xinference-v1.17.1优化技巧&#xff1a;如何提升模型加载速度和推理性能&#xff0c;节省硬件资源 你是否遇到过这样的困扰&#xff1a;每次加载大语言模型都要等待漫长的几分钟&#xff1f;推理过程中GPU内存爆满导致程序崩溃&#xff1f;或者看着高昂的云计算账单发愁&…...

YOLOFuse镜像亮点解析:环境零配置与多种融合策略详解

YOLOFuse镜像亮点解析&#xff1a;环境零配置与多种融合策略详解 1. 引言&#xff1a;多模态检测的工程挑战 在智能安防和自动驾驶领域&#xff0c;工程师们经常面临一个现实问题&#xff1a;白天表现优秀的目标检测系统&#xff0c;到了夜间或恶劣天气环境下性能急剧下降。传…...

3分钟搞定:Source Code Pro字体终极配置指南,让代码阅读体验提升300%

3分钟搞定&#xff1a;Source Code Pro字体终极配置指南&#xff0c;让代码阅读体验提升300% 【免费下载链接】source-code-pro Monospaced font family for user interface and coding environments 项目地址: https://gitcode.com/gh_mirrors/so/source-code-pro 你是…...

告别网线乱绕!实测Windows 10/11的‘移动热点’与‘网络共享’到底哪个更适合给开发板共享网络

Windows网络共享方案深度评测&#xff1a;移动热点 vs 适配器共享 每次在工作室调试开发板时&#xff0c;最头疼的就是网线缠绕的问题。作为嵌入式开发者&#xff0c;我们经常需要为各种开发板&#xff08;比如STM32、树莓派或者RK3588套件&#xff09;提供网络连接。Windows系…...

HunyuanVideo-Foley 安全与权限管理:企业内网API访问控制实践

HunyuanVideo-Foley 安全与权限管理&#xff1a;企业内网API访问控制实践 1. 企业AI服务的安全挑战 随着AI技术在企业内部的广泛应用&#xff0c;视频处理类API的安全管理成为IT部门的新课题。HunyuanVideo-Foley作为专业的音视频处理工具&#xff0c;在私有化部署场景下需要…...

FastAPI GraphQL接口缓存:Response Cache优化完整指南

FastAPI GraphQL接口缓存&#xff1a;Response Cache优化完整指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI是一个高性能…...

告别手动回复!用Python+uiautomation给微信PC版做个关键词自动回复机器人

用Python打造微信PC版智能应答机器人&#xff1a;从消息监控到自动化交互 每次打开微信都被海量消息淹没&#xff1f;客服咨询重复率高达70%&#xff1f;社群运营每天机械回复相同问题&#xff1f;这些场景背后隐藏着一个共同痛点——低效重复劳动正在吞噬现代人的生产力。今天…...

精准拓客新范式:号码核验行业的痛点破解与技术赋能之路,氪迹科技法人号码核验系统,阶梯式价格

在B端拓客进入精细化竞争的深水区&#xff0c;“有效线索”成为企业突破增长瓶颈的核心抓手&#xff0c;而号码核验作为拓客流程的前置关键环节&#xff0c;其服务质量直接决定了后续线索转化效率与投入回报比。据Gartner相关报告显示&#xff0c;传统拓客渠道的单个有效线索成…...

Stable Diffusion v1.5保姆级教程:输入英文描述,轻松生成专属AI画作

Stable Diffusion v1.5保姆级教程&#xff1a;输入英文描述&#xff0c;轻松生成专属AI画作 想体验AI绘画的魅力&#xff0c;却担心操作复杂、门槛太高&#xff1f;别担心&#xff0c;今天这篇教程就是为你准备的。我们将手把手教你使用 Stable Diffusion v1.5 这个经典的AI绘…...