PythonWeb开发基础(四 完)Response使用及wsgify装饰器

news2024/11/28 22:34:36

课程地址:Python 工程师进阶技术图谱

在这里插入图片描述

文章目录

  • 🌾 Response使用及wsgify装饰器
    • 1、Response的使用
    • 2、wsgify装饰器


🌾 Response使用及wsgify装饰器

1、Response的使用

前面一节我们知道了,使用webob的Request模块可以很方便地对请求进行解析。而接下来要介绍的Response模块,就可以方便地对响应进行封装:

  • 帮助调用start_response函数,返回响应头。
  • 对响应的正文进行封装。

上述两个操作就可以统一让一个Response类来进行。

def simple_app(environ:dict, start_response):
    
    res = Response()
    print(res.status_code)
    print(res.status)
    print(res.headers) # 一个对象
    print(res.headerlist) # 改成list类型而已

    res.body = '<h1>day day up!</h1>'.encode()
    return res(environ, start_response)  # 返回报文的正文部分,即网页内容

上面的代码就可以对请求产生一个规范的响应,不必自己单独调用start_response函数。用上面的代码替换之前的simple_app,运行一下:

'''
Serving on port 9000...
200
200 OK
ResponseHeaders([('Content-Type', 'text/html; charset=UTF-8'), ('Content-Length', '0')])
[('Content-Type', 'text/html; charset=UTF-8'), ('Content-Length', '0')]
'''

2、wsgify装饰器

虽然以前有时会用到装饰器,但我一直有些疑惑,装饰器到底是个什么东西,它具体在干啥?后面老师带着看了wsgify的一些源码,就稍微了解一些了。

装饰器,就是对目标进行封装的作用。

我们可以这样使用装饰器:

@wsgify
def app(request:Request) -> Response: # 一个请求对应一个响应
    return '<h1>day day up!</h1>'

上面这段代码就可以满足“app”的三个要求:

  • 可调用
  • 可以接收两个参数(environ和start_response)
  • return一个可迭代对象

但是看我们的app函数头def app(request:Request),只接受了一个参数;再看返回值,只是一个字符串<h1>day day up!</h1>,不是“可迭代”的。那么,它如何满足app的三个要求呢?

这就是装饰器的作用了!下面的其实函数app就作为一个参数,传递给了wsgify这个类(没错,wsgify就是一个类),我们看看这个类中__init__方法的源码

    def __init__(self, func=None, RequestClass=None,
                 args=(), kwargs=None, middleware_wraps=None):
        self.func = func
        if (RequestClass is not None
            and RequestClass is not self.RequestClass):
            self.RequestClass = RequestClass
        self.args = tuple(args)
        if kwargs is None:
            kwargs = {}
        self.kwargs = kwargs
        self.middleware_wraps = middleware_wraps

我们在@wsgify下面定义的app函数,就作为wsgify的func参数传递进来了,然后我们在代码中调用函数app时,实际调用的是wsgify这个类,而我们定义的app函数只是作为这个类的一个参数。

想要更多地了解@wsgify,可以阅读WebOb的文档 ,或wsgify源代码。

关于装饰器的理解,不如自己撸一个简单的装饰器试试!

# 创建一个类wrapper,作为装饰器
class wrapper:
    def __init__(self, func=None):
        self.func = func

    def __call__(self, x, *args):
        return self.func(x) + 1

@wrapper
def simple_f(x):
    return 2 * x

# -- main --
x = 3
y = simple_f(x)
print(y)

这段代码的输出是:

'''
7
'''

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依框架---PageHelper分页(十五)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小童&#xff0c;Java开发工程师&#xff0c;CSDN博客博主&#xff0c;Java领域新星创作者 &#x1f4d5;系列专栏&#xff1a;前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

STM32开发(7)----CubeMX配置串口通讯(轮询方式)

CubeMX配置串口通讯&#xff08;轮询方式&#xff09;前言一、串口的介绍二、实验过程1.实验材料2.STM32CubeMX配置PWM3.代码实现重载printf轮询接收4.编译烧录5.硬件连接6.实验结果重载printf结果串口轮询接收结果总结前言 本章介绍使用STM32CubeMX对串口进行配置的方法&…

​力扣解法汇总1797. 设计一个验证系统

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个…

vue:自定义组件如何使用v-model

问题&#xff1a; 在使用自定义组件时&#xff0c;我们有时候需要使用 v-model 来双向绑定。方法&#xff1a; 在vue中&#xff0c;v-model 的值相当于默认传递了一个名为 value 的 prop 和一个名为 input 的事件&#xff08;注意&#xff0c;这个value的prop是需要在自定义组件…

《皮格马利翁效应》-期待效应

“ 人生没有白走的路&#xff0c;没有白读的书&#xff0c;你触碰过的那些文字会在不知不觉中帮你认知这个世界 #每天读本书 #关注我每天解读一本书”《皮格马利翁效应》01关于作者朱瑟琳•乔塞尔森&#xff0c;女性心理学家&#xff0c;是国际 公认的精神医学大师欧文•亚隆的…

刚刚,微软推出支持chatGPT的必应

文章目录刚刚&#xff0c;微软推出支持chatGPT的必应什么是新的必应&#xff1f;如何体验页面初体验结语&#xff1a;搜索引擎的新时代刚刚&#xff0c;微软推出支持chatGPT的必应 这款新的必应功能允许用户通过自然语言方式与chatgpt进行交流&#xff0c;以获得快速、准确的信…

华为HCIE学习之openstack基础

文章目录一、Openstack各种文件位置二、Openstack命令操作1.使用帮助三、用命令发放云主机1、创建租户2、创建用户并与租户绑定3、注册镜像4、创建规格5、创建公有网络及其子网&#xff08;做弹性IP用&#xff09;6、创建私有网络及其子网7、创建路由并设置网关与端口8、创建安…

C++类与对象(中)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类中一共有六个默认成员函…

当ChatGPT遇到网络安全

ChatGPT&#xff1a;是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务。GPT 是 …

活动星投票文艺巡演活动免费投票程序制作网页投票网站

“文艺巡演活动”网络评选投票_线上小程序的投票方式_视频投票的功能_在线投票程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务…

ConcurrentHashMap底层原理介绍

概述: ConcurrentHashMap相对于HashMap的性能较差一些,但相比于Hashtable而言性能要高很多,因为Hashtable内部的所有方法都是同步方法,加了synchronized锁,所以性能上比较差,但在多线程环境下是具有很强的安全性的ConcurrentHashMap避免了对全局加锁改成了局部加锁操作&#xf…

Go最新版下载 Go1.20版新特性

Go官方正式发布了Go1.20稳定版 该版本依然保持 Go1 兼容性&#xff0c;可以升级到 Go1.20&#xff0c;而不需要做任何代码改动。 可以使用你任何喜欢的方式升级&#xff1a; 比如&#xff1a; go install golang.org/dl/go1.20latest 具体的可以参考官网教程&#xff1a; ht…

简介DNS协议、ICMP协议、NAT技术

文章目录一、DNS 协议1.背景2.域名二、ICMP 协议1.功能2.格式3. ping 命令4. traceroute 命令三、NAT 技术1.基本理解2. NAT 转换过程3. NAPT4. NAT 技术的缺陷5. NAT 和代理服务器一、DNS 协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;&#xff0…

【头歌】串的运算及应用

串的运算及应用第1关&#xff1a;求子串任务描述本关任务&#xff1a;实现字符串的求子串操作。相关知识为了完成本关任务&#xff0c;你需要理解&#xff1a;1. 求子串操作&#xff0c;2.字符串的顺序存储。求子串操作从一个字符串S的某个位置开始截取若干个连续字符&#xff…

采样电路的3个组成部分

采样电路的使用实际上是电路的一个闭环控制过程&#xff0c;也可以理解为一个负反馈过程&#xff0c;采集的信号被传送到主控制芯片进行调整。今天就来为您介绍一下采样电路的三个组成部分分析&#xff01;一起来看看吧&#xff01; 这里的采样实际上分为电流采样、电压采样、…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第6天(动态规划 专题)】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有61天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

EMR Studio 要点梳理

文章目录1. 关系梳理2. 网络配置2.1 必须是在私有子网中的EMR集群才可以被EMR Studio连接吗&#xff1f;2.2 关于网络安全组&#xff1a;DefaultEngineSecurityGroup 和 DefaultWorkspaceSecurityGroupGit2.3 18888端口2.4 无法访问Github的解决方法3. 集成Windwos AD身份认证4…

【王道数据结构】第六章(上) | 图详解

目录 一、图的基本概念 二、图的存储 1、邻接矩阵法 2、邻接表法(顺序链式存储) 3、十字链表存储 4、邻接多重表 三、图的基本操作 四、图的遍历 1、广度优先遍历 2、深度优先遍历 一、图的基本概念 1、图的定义 2、无向图 若E是无向边 简称边) 的有限集合时&#xff…

如何使用MongoDB?

一&#xff1a;与MySQL区别 RDBMS 与 MongoDB 对应的术语&#xff1a; 类似于mysql&#xff0c;刚开始数据库、集合都是要创建之后才有的。 但是每次插入数据时都是插入一个对象&#xff0c;整个对象就是文档&#xff0c;对象的属性名就是字段。字段是不需在提前创建时声明的…

linux基本功之fsck命令详解

&#x1f493; 大家好&#xff0c;我是沐风晓月&#xff0c;双一流院校英语计算机双专业在读&#xff1b; &#x1f493; 想要学好Linux&#xff0c;命令是基本功&#xff0c;企业中常用的命令大约200多个&#xff0c;不管是写shell脚本还是管理操作系统&#xff0c;最常用的命…