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',
]

多个中间件的执行顺序

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

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

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

相关文章

Pycharm里如何设置多Python文件并行运行

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夕阳何事近黄昏&#xff0c;不道人间犹有未招魂。 大家好&#xff0c;我是皮皮。 一、前言 相信使用Pycharm的粉丝们肯定有和我一样的想法&#xff0c;…

在Ubuntu22.04上部署FoooCUS2.1

Fooocus 是一款基于 Gradio的图像生成软件&#xff0c;Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考&#xff1a; 1、从 Stable Diffusion 学习&#xff0c;该软件是离线的、开源的和免费的。 2、从 Midjourney 中学到&#xff0c;不需要手动调整&#xff0c;…

2024牛客寒假算法基础集训营3部分题解

智乃与瞩目狸猫、幸运水母、月宫龙虾 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 Ubuntu是一个以桌面应用为主的Linux发行版操作系统&#xff0c;其名称来自非洲南部祖鲁语或豪萨语的"ubuntu"一词&#xff0c;意思是"人性…

【C++】内存五大区详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Flutter学习(八)Flutter_Boost接入

背景 基于安卓的原生项目&#xff0c;进行Flutter的接入&#xff0c;进行混合开发。 参考链接 官方地址&#xff1a;link fullter_boost配置&#xff1a;link git代理配置&#xff1a;link kotlin语法集成&#xff1a;link 混合开发的坑&#xff1a;link 开发环境 as4…

【从Python基础到深度学习】7. 使用scp命令实现主机间通讯

一、生成 SSH 密钥对 ssh-keygen 是一个用于生成 SSH 密钥对的命令行工具&#xff0c;用于身份验证和加密通信 ssh-keygen 二、将本地主机上的 SSH 公钥添加到远程主机 ssh-copy-id 命令用于将本地主机上的 SSH 公钥添加到远程主机上的 authorized_keys 文件中&#xff0c;…

第12讲创建图文投票实现

创建图文投票实现 图文投票和文字投票基本一样&#xff0c;就是在投票选项里面&#xff0c;多了一个选项图片&#xff1b; <view class"option_item" v-for"(item,index) in options" :key"item.id"><view class"option_input&qu…

【漏洞复现】狮子鱼CMS某SQL注入漏洞

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库&#xff0c; 所以我简单实现了一个 代码&#xff1a; https://github.com/Shujie-Tan/go-redis-sentry 使用方法&#xff1a; import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…

【C语言】模拟实现库函数qsort

qsort的头文件是stdlib.h 他的四个参数分别是要进行排序的数组base的首地址&#xff0c;base数组的元素个数&#xff0c;每个元素的大小&#xff0c;以及一个函数指针&#xff0c;这个函数指针指向了一个函数&#xff0c;这个函数的参数是两个void*类型的指针&#xff0c;返回类…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF&#xff1a;https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人&#xff0c;知识面广得惊人&#xff0c;也善于举一反三&#xff0c;知识之间互相关联&#xff0c;比如有个地方把读路径比作programming …

基于 Python 的大数据的电信反诈骗系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

three.js 箭头ArrowHelper的实践应用

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div></div></el-main></…

Linux系统安全:安全技术 和 防火墙

一、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,类 似于监控…

【Java】零基础蓝桥杯算法学习——二分查找

算法模板一: // 数组arr的区间[0,left-1]满足arr[i]<k,[left,n-1]满足arr[i]>k;Scanner scan new Scanner(System.in);int[] arr {1,2,3,4,5};int left 0,right arr.length-1;int k scan.nextInt();while(left<right) {//leftright时退出循环int mid (leftrigh…

Hadoop:认识MapReduce

MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据&#xff0c;通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业&#xff0c;如文本处理、数据分析和大规模数据集的聚合等。然而&#xff0c;MapReduce也有…

开源免费的Linux服务器管理面板分享

开源免费的Linux服务器管理面板分享 一、1Panel1.1 1Panel 简介1.2 1Panel特点1.3 1Panel面板首页1.4 1Panel使用体验 二、webmin2.1 webmin简介2.2 webmin特点2.3 webmin首页2.4 webmin使用体验 三、Cockpit3.1 Cockpit简介3.2 Cockpit特点3.3 Cockpit首页3.4 Cockpit使用体验…

算法沉淀——栈(leetcode真题剖析)

算法沉淀——栈 01.删除字符串中的所有相邻重复项02.比较含退格的字符串03.基本计算器 II04.字符串解码05.验证栈序列 栈&#xff08;Stack&#xff09;是一种基于先进后出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则的数据结构。栈具有两个主要的操作&am…

宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)

宿舍报修小程序目录 目录 基于微信小程序的宿舍报修系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生信息管理 2 维修人员管理 3、故障上报管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…