廖大python实战项目第五天

PS: 决定还是坚持写博客记录一下比较好。

今天的实战内容是编写web框架,如果之前的知识不熟悉的话确实看不大懂。在这里奉上自己的理解以及帮助理解的相关资料和文档。


Web框架

首先我们要知道web框架是什么东西,它到底要怎么实现。这一点廖大在web开发的WSGI接口使用web框架这两篇文章里已经说过了。摘要一些略作说明:

def application(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    return [b‘<h1>Hello, web!</h1>‘]

上面这段代码实现了响应HTTP请求,其中start_response 发送了HTTP响应的Headerreturn 则将HTTP响应的body 返回。在这里面,如何接受、解析HTTP请求和发送HTTP响应不是我们关注的重点,我们该做的是决定用什么内容去响应HTTP请求,而其余部分交给WSGI接口去实现。这里已经出现了第一层的抽象,让我们摆脱烦杂的底层逻辑。

然而单单实现这个还是不够的,对比WebApp的处理逻辑,这里还是有些低级。一个url对应一个HTTP请求,而HTTP请求可分为GET,POST,PUT,DELETE等等,我们自己用一个一个的函数实现不大现实。所以我们需要对WSGI接口做进一步的抽象,也就是所谓的Web框架

回到廖大的这一天的实战内容,是要对aiohttp封装一个更高层次的web框架。为了看懂aiohttp实现HTTP响应的逻辑(整体和同步一样但是还是有一些差别影响理解),我们需要先把之前的异步IO那四篇都回顾一下,在这里,aiohttp官方文档还有Server Usage可以帮助我们更好地理解request,Response,Application这三个方法的功能。

涉及到模块渲染装饰器我一开始有些不清楚,补一下对应的章节就明白了。


__call__()方法

廖大提到一个方法__call()__,只要一个类定义了这个方法,就可以将它的实例视为函数。这里先上一篇文章Python的特殊函数 __call()__算是讲得很清楚了。python中函数是一个对象,与普通类的实例不同的是,函数是callable;但只要给一个类添上__call()__方法,就可以实现像函数那样的调用。


getattr()方法

这个方法在前两天的实战中已经见过,但还是补一下资料内容。文章:Python的hasattr(), getattr(), setattr()函数使用方法详解

getattr()是用于获取对象的属性或方法,如果存在就打印出来,如果不存在就打印出默认值。需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。


inspect模块

参考:

Python文档--inspect模块介绍

中文版inspect模块介绍

在这段实例中:

def add_route(app, fn):
    method = getattr(fn, ‘__method__‘, None)
    path = getattr(fn, ‘__route__‘, None)
    if path is None or method is None:
        raise ValueError(‘@get or @post not defined in %s.‘ % str(fn))
    if not asyncio.iscoroutinefunction(fn) and not inspect.isgeneratorfunction(fn):
        fn = asyncio.coroutine(fn)
    logging.info(‘add route %s %s => %s(%s)‘ % (method, path, fn.__name__, ‘, ‘.join(inspect.signature(fn).parameters.keys())))
    app.router.add_route(method, path, RequestHandler(app, fn))

廖大用到了之前没见过的inspect模块。其中inspect.isgeneratorfunction()好理解,从字面上可以知道是判断是否为generaor函数。具体的实现暂时不去管它。

后面那个inspect.signature(fn).parameters.keys()有点费解。其中inspect.signature()的功能根据官方文档讲是Return a Signature object for the given callable,即返回传入的可调用函数的所有参数;而之后的paramters似乎是用于索引参数。这是官方的两个示例:

关于signature

>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
‘(a, *, b:int, **kwargs)‘

>>> str(sig.parameters[‘b‘])
‘b:int‘

>>> sig.parameters[‘b‘].annotation
<class ‘int‘>

关于parameter

>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
        # KEYWORD_ONLY: 关键字参数
...         print(‘Parameter:‘, param)
Parameter: c

所以,廖大的那段代码的意思是将函数的所有参数(不包括默认值)用逗号隔开,加入到那个括号里去。


rfind()方法

从右向左查询,返回字符串首次出现的位置;如果没有匹配项则返回-1。

find()与之类似,只不过是从左向右查询。


__import__()

参考:

Python官方文档

__import__中文介绍

__import__内置函数是用于动态加载模块的。这个不难理解,关键是理解廖大的示例:

def add_routes(app, module_name):
    n = module_name.rfind(‘.‘)  # 找到模块名的最后一个‘.‘位置
    if n == (-1):               # 如果模块名为“XX”这种形式
        mod = __import__(module_name, globals(), locals())
    else:                       # 如果模块名为"XX.XX"这种形式
        name = module_name[n+1:] # 后半部分即子函数
        mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name)         # 加载模块,获取模块的子函数并返回
    for attr in dir(mod):        # 对于子函数里的所有属性和方法
        if attr.startswith(‘_‘): # 如果attr为”__XX"这种形式就忽略
            continue
        fn = getattr(mod, attr)
        if callable(fn):         # 如果可调用
            method = getattr(fn, ‘__method__‘, None)
            path = getattr(fn, ‘__route__‘, None)
            if method and path:
                add_route(app, fn)

拦截器

拦截器廖大python实战项目第五天

原文地址:https://www.cnblogs.com/ChanWunsam/p/10018256.html

时间: 2024-08-08 16:29:14

廖大python实战项目第五天的相关文章

廖大python实战项目第四天

数据库操作问题 参考: 用命令行创建MySQL数据库 菜鸟教程--MySQL (尤其是这一篇:MySQL管理) 启动MySQL时出现问题 数据库操作这块先会用就行.过程中难免遇到很多奇奇怪怪的问题,我把我自己解决的问题发上来. 首先就是廖大的test有一些小错误,我根据评论区以及自己的理解改了一下: # 'test.py' #!/usr/bin/env python3 # -*- coding: utf-8 -*- import orm import asyncio from models im

廖大python实战教程第七天

MVC框架 使用模板 MVC的全名是Model View Controller,是模型-视图-控制器的缩写,是一种软件设计典范.使用MVC的目的是使M和V的代码分离,从而使一个程序可以有不同的表现形式. 各种错误 这个地方在所难免.实在没想到用IDE照着敲都会有一些不注意的小细节错误. 一开始页面是 404 Not Found.等查明原因后发现add_routes()函数没有执行,里面有三四处错误.一般来说,404 Not Found的日志不会有这么一句::add route GET / =>

数据工程师必须掌握的7个大数据实战项目

简介: 值得收藏,数据工程师必须掌握的7个大数据实战项目 原创: Lenis 有关SQL 1作为一名电影爱好者,我阅片无数,有些片子还经常翻来覆去看个好几遍.小时候因为这事儿,没少被我妈抓耳朵,“看过的片子为啥还要倒二遍?”我也说不上来,就是单纯的爱看. 男人爱看的电影,以武侠,动作,科技为多,也认识了一帮明星,比如尼古拉斯凯奇,史泰龙,李小龙,成龙,李连杰,甄子丹等等.这些人很猛,有男人气.只要是他们的片儿,肯定不落下.在我眼里,他们就是好片代名词. 不知几何时,电影上开始出现一些不认识的男明

这4个Python实战项目,让你瞬间读懂Python!

前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择. Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的.随着越来越多地在工业中,被诸如联合太空联盟(NASA 的主要飞机支持承包商)和工业光魔(VFX 和

干货 | 这4个Python实战项目,让你瞬间读懂Python!

Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择. Python是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的.随着越来越多地在工业中,被诸如联合太空联盟(NASA的主要飞机支持承包商)和工业光魔(VFX 和卢卡斯影业的动画工

Python实战项目网络爬虫 之 爬取小说吧小说正文

本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 链接:http://tieba.baidu.com/p/4792877734 首先,自己定义一个类,方便使用.其实类就像一个"水果篮",这个"水果篮"里有很多的"水果",也就是我们类里面定义的变量啊,函数啊等等,各种各样的.每一种"水果&q

10大Python开源项目推荐(Github平均star2135)

翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望你能够喜欢~~ ▌Rank 1:Requests-HTML v0.9(7385 stars on Github,来自Kenneth Reitz) 该库旨在尽可能简单直观地解析 HTML,仅支持 Python 3.6. 项目地址: https://github.com/kennethreitz/req

十大C++实战项目,你会几个?【高薪必备】

前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 市面上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点. 如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的! 如果你不知道C++可以用来做哪些项目,可以应用在哪些地方,那么,可以去小编的C++交流.裙 :九起久伞吧起伞留伞(数字的谐音)转换下可以找到了,里面有最新C++教程项目 *

大数据实战项目必备技能三:storm

导读: Storm是一个分布式计算框架,主要使用Clojure与Java语言编写,最初是由Nathan Marz带领Backtype公司团队创建,在Backtype公司被Twitter公司收购后进行开源.最初的版本是在2011年9月17日发行,版本号0.5.0. 2013年9月,Apache基金会开始接管并孵化Storm项目.Apache Storm是在Eclipse Public License下进行开发的,它提供给大多数企业使用.经过1年多时间,2014年9月,Storm项目成为Apache