【从零学习python 】91. 使用装饰器和字典管理请求路径的简洁Web应用

简介: 【从零学习python 】91. 使用装饰器和字典管理请求路径的简洁Web应用

导入必要的模块

from wsgiref.simple_server import make_server
from utils import load_html, load_template

这两行代码首先导入了make_server函数和自定义的load_htmlload_template函数,以便后续使用。

创建路由字典

g_url_route = {}

定义了一个全局变量g_url_route作为路由字典,用于保存请求路径和处理函数之间的对应关系。

装饰器函数route

def route(url):
    def handle_action(action):
        g_url_route[url] = action
        def do_action(start_response):
            return action(start_response)
        return do_action
    return handle_action

route是一个装饰器函数,在定义路由时使用。它接受一个url参数,并返回一个内部函数handle_action。在内部函数中,它将请求路径url与处理函数action进行关联,并定义了一个新的函数do_action,该函数接受start_response参数并执行action函数。最后返回do_action函数。

路由定义及处理函数

@route('/index.html')
@route('/')
def show_home(start_response):
    return load_html('/index.html', start_response)

这是一个示例,使用route装饰器定义了两个路由:/index.html/,并将它们分别与show_home函数关联起来。当请求路径匹配到这两个路由之一时,将执行show_home函数。

@route('/test.html')
def show_test(start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
    return ['我是一段普通的文字'.encode('utf-8')]

这是另一个示例,使用route装饰器定义了一个路由/test.html,并将其与show_test函数关联起来。当请求路径匹配到该路由时,将执行show_test函数。该函数设置了响应头信息,并返回一段普通的文字作为响应内容。

@route('/info.html')
def show_info(start_response):
    return load_template('/info.html', start_response, name='张三', age=18)

同样使用route装饰器定义了一个路由/info.html,并将其与show_info函数关联起来。当请求路径匹配到该路由时,将执行show_info函数。该函数使用load_template函数加载/info.html模板,并传入nameage参数进行渲染。

请求处理函数application

def application(environ, start_response):
    file_name = environ.get('PATH_INFO')
    try:
        return g_url_route[file_name](start_response)
    except Exception:
        start_response('404 NOT FOUND', [('Content-Type', 'text/html;charset=utf-8')])
        return ['对不起,界面未找到'.encode('utf-8')]

application函数是WSGI应用程序的入口点。它接受environstart_response两个参数,用于处理HTTP请求。首先,获取请求路径file_name。然后,尝试从路由字典中找到匹配的处理函数,并执行该函数。如果找不到对应的处理函数,则返回404状态码及相应的错误信息。

服务器启动并监听

if __name__ == '__main__':
    httpd = make_server('', 8000, application)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

这部分代码用于启动服务器并监听指定端口(8000)。当程序被直接运行时(而不是作为模块导入),将创建一个WSGI服务器并调用application函数来处理请求。同时打印提示信息表示服务器正在运行,并通过httpd.serve_forever()实现持续监听。

完整代码

from wsgiref.simple_server import make_server
from utils import load_html, load_template
g_url_route = {}
def route(url):
    def handle_action(action):
        g_url_route[url] = action
        def do_action(start_response):
            return action(start_response)
        return do_action
    return handle_action
@route('/index.html')
@route('/')
def show_home(start_response):
    return load_html('/index.html', start_response)
@route('/test.html')
def show_test(start_response):
    start_response('200 OK', [('Content-Type', "text/html;charset=utf-8")])
    return ['我是一段普通的文字'.encode('utf-8')]
@route('/info.html')
def show_info(start_response):
    return load_template('/info.html', start_response, name='张三', age=18)
def application(environ, start_response):
    file_name = environ.get('PATH_INFO')
    try:
        return g_url_route[file_name](start_response)
    except Exception:
        start_response('404 NOT FOUND', [('Content-Type', 'text/html;charset=utf-8')])
        return ['对不起,界面未找到'.encode('utf-8')]
if __name__ == '__main__':
    httpd = make_server('', 8000, application)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

目录
打赏
0
1
1
0
25
分享
相关文章
|
11天前
|
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
127 82
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
114 61
Python装饰器实战:打造高效性能计时工具
Python装饰器是什么?
装饰器是Python中用于动态修改函数、方法或类功能的工具,无需改变原代码。通过将函数作为参数传递并返回新函数,装饰器可以在原函数执行前后添加额外逻辑。例如,使用`@logger`装饰器可以打印函数调用日志,而`@timethis`则可用于计算函数执行时间。为了保持被装饰函数的元信息(如`__name__`和`__doc__`),可使用`functools.wraps`装饰器。此外,带参数的装饰器可通过嵌套函数实现,如`@timeitS(2)`,以根据参数条件输出特定信息。
92 59
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【02】整体试验思路,在这之前我们发现sec_uid,sec_uid是什么和uid的关系又是什么?相互如何转换?python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
32 6
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
|
11天前
|
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
20 3
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
2月前
|
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
51 2

热门文章

最新文章