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

总结

完整代码

。。。

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

时间: 2024-10-11 13:30:27

Web框架高级功能之模板、拦截器、Json、打包的相关文章

JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor{} //创建方式2: 继承AbstractInterceptor -> struts2的体贴 //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法 public class MyInterceptor2

Java Web学习(十)Java拦截器

一.引言 我们日常开发中,经常会遇到这个场景:在访问系统功能前,需要用户登录,不登陆的话无法使用我们的系统,那么如果在每个方法前都加上登录代码...[emmm....我想应该不会有人这么干吧...],常见的可以使用以下几种方式: 使用AOP切面功能来实现 实现WebMvcConfigurer接口,重写addCorsMappings()方法和addInterceptors()方法 下面我们就一起来看下一下怎么实现吧~ 二.代码实现 AOP切面方式 切面方式配置的话,得配置到包路径下或者每个具体方法

struts2框架学习笔记6:拦截器

拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; //拦截器的第一种创建方式 //拦截器的生命周期:随项目启动创建,随项目关闭而销毁 public class MyInterceptor implements Intercepto

好记性不如烂笔头50-javaWeb框架struts2中的方法拦截器(5)

1. Struts2的方法拦截器概述 Struts2拦截器也可以通过MethodFilterInterceptor类实现,MethodFilterInterceptor重写了AbstractInterceptor类的intercept(ActionInvocationinvocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法.从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了

WebService框架CXF实战一自定义拦截器(五)

CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器.也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承AbstractPhaseInterceptor或者AbstractPhaseInterceptor的子类(如AbstractSoapInterceptor)即可. 自定义权限认证拦截器 权限认证拦截器处理SOAPHeader中的认证信息,客户端在发起请求时在SOAPHeader中添加认证信息,服务端在接收到请求

djongo web 框架 路由(urls)、模板(templates)、Ajax、models

Django基础篇 一.创建Django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他常用命令: python manage.py runserver 0.0.0.0 python manage.py startapp appname #创建app命令 python manage.py syncdb python manage.py makemigrations  #创建models pytho

Struts2(五)——核心拦截器

Struts框架一共为我们提供了35个拦截器,其中默认的拦截器有18个,框架访问action的异常处理,配置信息处理,转发重定向选择,上传等等等等,都是这18个拦截器中设置的,起着非比寻常的作用.而这些在struts-default.xml文件中都有设置,看一下吧: [html] view plaincopyprint? <interceptor-stack name="defaultStack"> <interceptor-ref name="except

Struts2(XWork)拦截器的功能介绍:

  拦截器 名字 说明 Alias Interceptor alias 在不同请求之间将请求参数在不同名字件转换,请求内容不变 Chaining Interceptor chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type="chain">)结合使用. Checkbox Interceptor checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,

框架 day28 Struts2-封装数据,类型转换,数据校验,国际化,拦截器

封装数据(重要) 1.1普通字段,action属性[★★] *编写表单,提供表单元素,<input name="" /> name的值为普通字符串,及javaweb编写内容. <inputname="userName"> *将name的值当成action属性(property),提供setter方法 publicvoid setUserName(String uesrName){} //用于封装数据 private String userNa