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数据交互-拦截器

web框架--tornado框架之模板引擎

web框架之Flask

asyncio创建协程解析——分析廖雪峰的Python教程之创建WEB服务(转)

Web开发框架之Flask入门

1.python web框架tornado之web框架简单介绍模板语言介绍