zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    3.2spring源码系列----循环依赖源码分析
    3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
    Jetson AGX Xavier ROS 调用usb单目摄像头运行ORB_SLAM2
    Jetson AGX Xavier ROS下调用USB单目摄像头
    SpringCloud-OpenFeign组件的使用
    SpringCloud-服务间通信方式
    SpringCloud-服务注册中心
    SpringCloud入门
    K8s—集群搭建
    Redis—过期策略以及内存淘汰机制
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11622195.html
Copyright © 2011-2022 走看看