Web框架高级功能之模板拦截器Json打包
Posted xiaoshayu520ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web框架高级功能之模板拦截器Json打包相关的知识,希望对你有一定的参考价值。
类Flask框架实现
模板
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <br>显示数据<\\br> id name age </body> </html>
import re from io import StringIO,BytesIO d = ‘id‘:5,‘name‘:‘tom‘,‘age‘:20 class Template: _pattern = ‘([a-zA-Z0-9_]+)‘ regex = re.compile(_pattern) @classmethod def render(cls,template,data:dict): html = StringIO() with open(template,encoding=‘utf-8‘) as f: for line in f: start = 0 newline = ‘‘ for matcher in cls.regex.finditer(line): newline += line[start:matcher.start()] print(matcher,matcher.group(1)) key = matcher.group(1) tmp = data.get(key,‘‘) newline += str(tmp) start = matcher.end() else: newline += line[start:] html.write(newline) print(html.getvalue()) html.close()#模板渲染 filename = ‘index.html‘ Template.render(filename,d)
jinja2
文档 官网 https://jinja.palletsprojects.com/en/2.10.x/ 中文 http://docs.jinkan.org/docs/jinja2/ 安装 pip install jinja2 pip install MarkupSafe
模板构建
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Magedu</title> </head> <body> <ul> 显示数据 % for id,name,age in userlist % <li>loop.index,id,name,age</li> % endfor % </ul> 总共usercount人 </body> </html>
#################加载模板代码如下示例################### from jinja2 import Environment,PackageLoader,FileSystemLoader # env = Environment(loader=PackageLoader(‘webarch‘,‘templates‘)) #包加载器 env = Environment(loader=FileSystemLoader(‘webarch/templates‘)) template = env.get_template(‘index.html‘) userlist = [ (3,‘tpm‘,20), (4,‘het‘,23), (7,‘asdf‘,23), (1,‘aasf‘,18) ] d = ‘userlist‘:userlist,‘usercount‘:len(userlist) print(template.render(**d))
###############提供模板模块template.py################## from jinja2 import Environment,PackageLoader,FileSystemLoader env = Environment(loader=PackageLoader(‘webarch‘,‘templates‘)) #包加载器 # env = Environment(loader=FileSystemLoader(‘webarch/templates‘)) #文件系统加载器 def render(name,data:dict): """ 模板渲染 :param name: 去模板目录搜索此模板名的文件 :param data: 字典数据 :return: HTML字符串 """ template = env.get_template(name) #搜索模块index.html return template.render(**data)
##############代码中增加################## #创建Router对象 idx = Router() py = Router(‘/python‘) user = Router(‘/user‘) #注册 App.register(idx,py) App.register(user) py.register_preinterceptor(ip) @user.get(r‘^/?$‘) def userhandler(request): userlist = [ (3, ‘tpm‘, 20), (4, ‘het‘, 23), (7, ‘asdf‘, 23), (1, ‘aasf‘, 18) ] d = ‘userlist‘:userlist,‘usercount‘:len(userlist) return render(‘index.html‘,d)
模块化
1.创建包webarch 2.template.py模块移入此包 3.新建web.py模块,将AttrDict、Router、App类放入其中 4.将路由定义、注册代码、handler定义移入webarch/__init__.py中 5.在项目根目录下,建一个app.py,里面放入启动server的代码。
拦截器interceptor
#加入拦截器功能的方式 1、App和Router类直接加入 把拦截器的相关方法、属性分别添加到相关类中 实现简单 2、Mixin App和Router类都需要这个拦截器功能,可以使用Mixin方式、将属性、方法组合进来,但是,App类拦截器适合使用第二种,但是Router的拦截器是每个实例不一样的,所以使用第一种方式实现
def fn(request:Request) -> Request: pass
def fn(request:Request,response:Response) -> Response: pass
IP拦截
#创建Router对象 idx = Router() py = Router(‘/python‘) user = Router(‘/user‘) #注册 App.register(idx,py) App.register(user) #ip拦截 def ip(request:Request): print(request.remote_addr,‘~~~~~‘) print(type(request.remote_addr)) if request.remote_addr.startswith(‘192.‘): return request else: return None #返回None将截断请求 py.register_preinterceptor(ip)
Json支持
@py.get(r‘^/id$‘) def pythonhandler(request): userlist = [ (3, ‘tom‘, 20), (5, ‘jerry‘, 16), (6, ‘sam‘, 23), (8, ‘kevin‘, 18) ] d = ‘userlist‘:userlist,‘usercount‘:len(userlist) res = Response(json=d) return res
总结
完整代码
。。。
以上是关于Web框架高级功能之模板拦截器Json打包的主要内容,如果未能解决你的问题,请参考以下文章
springmvc-高级参数绑定-映射-异常-json数据交互-拦截器