码迷,mamicode.com
首页 > Web开发 > 详细

Web框架高级功能之模板、拦截器、Json、打包

时间:2019-08-09 01:08:39      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:font   图片   搜索   filename   org   模板   flask框架   def   att   

类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、打包

标签:font   图片   搜索   filename   org   模板   flask框架   def   att   

原文地址:https://www.cnblogs.com/xiaoshayu520ly/p/11324628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!