
正文
python视图函数包装的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
python如何封装函数
可以定义一个类,类里定义很多函数(主要用它做什么)或直接定义函数在一个py文件中
在另一个文件中导入这个那个py包,调用类和方法
就是封装了
相关问答
Q1: Flask视图:视图函数,类视图,蓝图使用方法整理
摘要: Flask , 视图 , 视图函数 , 类视图 , 方法视图 , 装饰器 , 蓝图
在Flask中 路由 是指用户请求的 URL 与 视图函数 之间的 映射 ,处理URL和函数之间关系的程序称为路由。Flask根据HTTP请求的URL在路由表中匹配预定义的URL找到对应的视图函数。将视图函数的执行结果返回给服务器。
Flask中默认使用 @app.route 装饰器将视图函数和URL绑定,装饰器是一种接受函数的函数,返回新的函数。
使用装饰器将视图函数page和url '/'关系绑定带 app.url_map 属性上,打印app.url_map的结果如下,有两条url规则,分别是根目录下的URL规则和static目录下的URL规则
可以给装饰器增加 endpoint 参数给 url命名 ,一旦使用了endpoint参数 url_for 反转就不能使用视图函数名了而要使用定义的url名。
url_for('index')的输出是字符串格式url的内容"/"
也可以不使用装饰器,使用 add_url_rule 将视图函数和url绑定,装饰器 @app.route 实际是调用的 add_url_rule 方法
视图函数也可以结合类来实现,类视图的好处是支持 继承 ,可以将共性的东西放到父类中,类视图需要使用 app.add_url_rule() 来进行注册,类视图分为 标准类视图 和 基于调度方法的类视图
标准类视图有标准的写法
使用类视图,在父类中定义一个属性,在子类中完成各自的业务逻辑,同时都继承父类中的这一个属性
分别定义三个子类的模板
查看结果,三个url的返回除了三个模板各自的内容外都需要输出父类的ads属性
如果同一个视图函数需要根据 不同的请求方式 进行不一样的逻辑处理,需要在视图函数内部进行判断,可以使用 方法类视图 实现,使用类继承 flask.views.MethodView ,定义和请求方式 同名的小写方法 来完成了逻辑处理。
编辑一个页面直接访问是输出用户名密码页面,提交表单后是密码正确与否的提示。
在html中定义 form 标签action属性关联url名
如果不用方法视图实现需要在普通视图内部调用 request.method 判断是否为 GET , POST 进行判断
装饰器的本质是一个Python函数, 接受一个函数 , 返回一个函数 ,目的是让一个函数获得 其他额外的功能 。
假设一个场景访问新闻详情页又一个函数实现,但是之前必须先登录,登录由另一个函数实现,此时需要将访问新闻函数传递给登录函数返回一个新的函数作为整体的逻辑实现,这个给登录函数增加新功能浏览网页的过程就是装饰器。
控制台输出,new_func()执行了新函数,基础函数user_login执行了新加入的功能,新函数真实的函数名还是inner
如果使用装饰器魔法符号实现,此时直接调用被装饰的函数即可实现带有新功能的基础函数,函数作为参数传入的过程已经自动实现
在基础函数和要包装的函数上都支持传递参数
查看 app.route() 的源码内部也是将视图函数包装,在原函数执行之前调用 add_url_rule 绑定url,endpoint和视图函数的关系,再返回原函数实现业务逻辑
蓝图的目的是实现 各个模块的视图函数写在不同的py文件中 ,在主视图中导入分路由视图的模块,并注册蓝图对象, 降低各个功能模块的耦合度 ,使用 flask.Blueprint 定义蓝图, app.register_blueprint 注册蓝图。
实现主页,详情页,对比页三个页面,在主页中导入两个其他功能页,先编写两个功能页的蓝图detail.py和compare.py
使用 app = Blueprint('detail', __name__) 定义蓝图对象, detail 是蓝图名,蓝图名不能重复。再编写主视图main.py,在主视图中注册之前的蓝图,其他视图函数的名字不能和蓝图名一致
查看效果
如果在蓝图的py脚本中调用了 url_for ,需要把蓝图的name(就是 name 之前的)也加入作为前缀,如下
Q2: Python进阶精华-编写装饰器为被包装的函数添加参数
注意:这种发方法并不是装饰器最常用的功能,但是在降低代码重复上可谓是首屈一指。比如:如果不使用装饰器,上述代码可能会很多:
当然,这里也有一个潜在的风险,就是当装饰器包裹的函数已经用了debug作为参数名,那么装饰器这里将会报错,所以要添加额外的一些判断来完善代码:
最后还剩下一部分比较难理解的地方,我将理解的注释在每行代码上方,这个问题就是,在打印被修饰函数的参数签名时,其实并不能正确显示参数签名,原因是因为被wrapper修饰过后的函数实际上应该使用的是wrapper的参数签名表,例如:
所以,接下来,完成最后最难的一步:






