wsgiref模块与jinja2模块编写web框架

wsgiref模块

from wsgiref.simple_server import make_server
# wsgiref本身就是个web框架,提供了一些固定的功能(请求和响应信息的封装,不需要我们自己写原生的socket了也不需要咱们自己来完成请求信息的提取了,提取起来很方便)
#函数名字随便起
def application(environ, start_response):
    '''
    :param environ: 是全部加工好的请求信息,加工成了一个字典,通过字典取值的方式就能拿到很多你想要拿到的信息
    :param start_response: 帮你封装响应信息的(响应行和响应头),注意下面的参数
    :return:
    '''
    start_response('200 OK', [('Content-Type', 'text/html'),('k1','v1')])
    print(environ)
    print(environ['PATH_INFO']) #获取的是请求路径
    #输入地址127.0.0.1:8000,这个打印的是'/',输入的是127.0.0.1:8000/index,打印结果是'/index'
    return [b'<h1>Hello, web!</h1>']

#和socketserver那个模块很像
httpd = make_server('127.0.0.1', 8080, application)

print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

jinja2字符串替换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>个人介绍</h1>
<ul>
    //jinja2的替换格式,对列表可以进行循环取值
    {% for i in hobby %}
    <li>{{ i }}</li>
    {% endfor %}
</ul>
</body>
</html>
#*************************
#python代码
from jinja2 import Template
def home(conn):
    # {% for i in hobby %}
    # <li>{{ i }}</li>
    # {% endfor %}
    with open('08jinja2test.html', 'r',encoding='utf-8') as f:
        data = f.read()
    t = Template(data)
    ret = t.render({'hobby':['金钱','女人','金鑫']})//对HTMl进行替换
    conn.send(ret.encode('utf-8'))
    conn.close()

jinja2和wsgire框架编写

import socket, time
from wsgiref.simple_server import make_server
from jinja2 import Template

# 客户端通过根路径访问时,服务端返回HTML页面
def home(conn):
    with open('test.html', 'r', encoding='utf-8')as f:
        new = str(time.time())
        s = f.read()
        # 将获取的动态时间替换掉HTML页面中的时间,达到动态返回页面的效果
        t = Template(s)
        ret = t.render({'hobby':['张达','猪繁育','力争']})
        return ret.encode('utf-8')
# 当客户端通过CSS路径访问的时候,服务端返回CSS文件
def style(conn):
    with open('style.css', 'rb')as f:
        return f.read()
# 当客户端通过JS路径访问的时候,服务端返回CSS文件
def index(conn):
    with open('test.js', 'rb')as f:
        return f.read()
# 当客户端通过请求索要图片的时候,服务端返回图片
def png(conn):
    with open('1.jpg', 'rb')as f:
        return f.read()
# 当客户端发送请求索要,ico文件的时候,返回ioc文件
def ico(conn):
    with open('wechat.ico', 'rb')as f:
        return f.read()
def ind(conn):
    with open('index.html', 'rb')as f:
        return f.read()
# 定义一个路径和文件的对应列表,节省代码,
urlList = [('/', home), ('/style.css', style), ('/test.js', index), ('/wechat.ico', ico), ('/index', ind),
           ('/1.jpg', png)]

def app(envion,start_sponse):
    #返回HTTP请求行
    start_sponse('200 ok',[])
    #获取请求路径
    path=envion['PATH_INFO']
    ret=None
    for i in urlList:
        if path==i[0]:
            ret=i[1](1)
            break
    if ret:
        return [ret]
    else:
        return [b'404']
httpd=make_server('127.0.0.1',8896,app)
httpd.serve_forever()

'''**************************************************'''
#前端代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <link rel="stylesheet" href="style.css">
    <link rel="icon" href="http://www.jd.com/favicon.ico">
    <script src="test.js"></script>
    <style>
        img{
             500px;
            height: 200px;
        }
    </style>
</head>
<body>
    #循环读取hobby的数据
    {% for i in hobby %}
    <h1 id="d1">欢迎猪繁育在{{i}}来到繁育基地</h1>
    {% endfor %}
    #申明结束
    <a href="/index">你大太阳</a>
    <img src="1.jpg" alt="">
</body>
</html>
原文地址:https://www.cnblogs.com/luckinlee/p/11622195.html