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

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

🌾 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
'''

相关文章
|
5天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
32 11
|
1天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
11 3
|
9天前
|
Python
探索Python装饰器:从入门到实践
【10月更文挑战第32天】在编程世界中,装饰器是一种特殊的函数,它允许我们在不改变原有函数代码的情况下,增加额外的功能。本文将通过简单易懂的语言和实际案例,带你了解Python中装饰器的基础知识、应用以及如何自定义装饰器,让你的代码更加灵活和强大。
14 2
|
9天前
|
监控 Python
探索Python中的装饰器:从入门到实践
【10月更文挑战第31天】在Python的世界里,装饰器是那些隐藏在幕后的魔法师,它们拥有着改变函数行为的能力。本文将带你走进装饰器的世界,从基础概念到实际应用,一步步揭开它的神秘面纱。你将学会如何用几行代码增强你的函数功能,以及如何避免常见的陷阱。让我们一起来发现装饰器的魔力吧!
|
10天前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:从基础到进阶
【10月更文挑战第30天】装饰器在Python中扮演着魔法般的角色,它们允许我们在不修改原始函数代码的情况下增加额外的功能。本文将通过简明的语言和直观的比喻,带你从零开始理解装饰器的概念、应用及其背后的原理。你将学会如何一步步构建自己的装饰器,并在代码示例的辅助下,解锁装饰器的更多可能。
|
17天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
12 1
|
2月前
|
缓存 测试技术 Python
Python 中的装饰器:从入门到实践
【9月更文挑战第3天】本文将引导你理解 Python 中装饰器的概念,并通过实际代码示例展示如何创建和使用装饰器。我们将从基础出发,逐步深入到装饰器的高级应用,让你能够轻松掌握这一强大的工具。
|
2月前
|
缓存 测试技术 开发者
探索Python中的装饰器:简化你的代码之旅
【9月更文挑战第6天】本文将深入探讨Python中一个强大而神秘的特性——装饰器。我们将通过实际例子揭示装饰器的工作原理,并展示如何利用它们来简化和增强你的代码。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇门,让你的代码更加优雅和高效。
|
3月前
|
测试技术 Python
Python中的装饰器入门与实践
【8月更文挑战第30天】本文将带你走进Python中一个既神秘又强大的特性——装饰器。我们将从装饰器的基本概念入手,通过简单示例揭示其背后的原理。接着,我们会深入探索装饰器的高级用法,包括带参数的装饰器、装饰器嵌套和函数修饰符。最后,我们将通过一个实战项目来巩固所学知识,让装饰器成为你编程工具箱中的得力助手。
|
2月前
|
数据安全/隐私保护 开发者 Python
Python 编程中的装饰器深入解析
【9月更文挑战第23天】本文将带你进入Python编程世界中一个既神秘又强大的工具——装饰器的探索旅程。我们将从基础定义出发,逐步深入到装饰器的应用实例和高级用法,让你在阅读中不仅理解装饰器的概念,更能掌握如何在实际项目中运用它们来简化代码和提高开发效率。文章最后还将探讨装饰器在现代Web框架中的应用,为你展示其背后的设计哲学和实用价值。