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

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...