• web框架原理


    web框架原理

    web框架主要分为三个部分

      1、启动socket服务端

      2、路由系统,写出uri与函数的对应关系

      3、模板引擎渲染,将html页面与mysql中的数据进行融合

    启动socket服务端

    import socket
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    # ①写socket服务端
    while True:
        conn, addr = server.accept()
    
        data = conn.recv(8192)
        data = str(data,encoding='utf-8')
        header = data.split('
    
    ')[0].split('
    ')[0]
        # 拿到需要的头部信息 GET / HTTP/1.1
        router = header.split(' ')[1]
        # 获取浏览器访问的uri信息 /
    
        # 我们要写一个uri与对应函数的映射关系
        # 拿出uri对应的函数名,调用
        func_name = None
        for rout in router_list:
            if rout[0] == router:
                func_name = rout[1]
                break
        # 判断访问的uri是否存在映射关系
        if func_name:   # 有就存在
            res = bytes('访问成功',encoding='utf-8')
        else:
            res = bytes('访问不存在',encoding='utf-8')
    
        # 拿到要返回给浏览器的结果后开始返回数据
    
        # 我们需要先返回一个响应头
        conn.send(bytes('HTTP/1.1 200 OK 
    
    '))    # 最简单的响应头
        # 再发送主体信息
        conn.send(res)
        # 关闭一次连接
        conn.close()

    路由系统 - uri与函数的对应关系

    # ②写函数与uri的映射关系
    def home():
        pass
    
    def index():
       pass
    
    router_list = [
        ('/',home),
        ('/index',index)
    ]
    # ①写socket服务端
    while True:
        conn, addr = server.accept()
    
        data = conn.recv(8192)
        data = str(data,encoding='utf-8')
        header = data.split('
    
    ')[0].split('
    ')[0]
        # 拿到需要的头部信息 GET / HTTP/1.1
        router = header.split(' ')[1]
        # 获取浏览器访问的uri信息 /
    
        # 我们要写一个uri与对应函数的映射关系
        # 拿出uri对应的函数名,调用
        func_name = None
        for rout in router_list:
            if rout[0] == router:
                func_name = rout[1]
                break
        # 判断访问的uri是否存在映射关系
        if func_name:   # 有就存在
            res = bytes('访问成功',encoding='utf-8')
        else:
            res = bytes('访问不存在',encoding='utf-8')
    
        # 拿到要返回给浏览器的结果后开始返回数据
    
        # 我们需要先返回一个响应头
        conn.send(bytes('HTTP/1.1 200 OK 
    
    '))    # 最简单的响应头
        # 再发送主体信息
        conn.send(res)
        # 关闭一次连接
        conn.close()

    模板引擎渲染

    自定义规则

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>渲染模板</title>
    </head>
    <body>
    <table>
        <!--占位字符-->
        @@content@@
    </table>
    </body>
    </html>
    渲染的页面
    def home():
        # 返回静态页面
        # 先读出静态html文件
        f = open('静态页面.html','r')
        data = f.read()
        f.close()
        return bytes(data,encoding='utf-8')
    
    
    def index():
        # 也要先读出html页面
        f = open('静态页面.html', 'r')
        data = f.read()
        f.close()
    
        # 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具)
        # 第一种,自定义规则,先在需要放数据的地方用自定义的占位符占位
        # 链接数据库,取出想要的数据
        import pymysql
        conn = pymysql.connect(host='127.0.0.1',user='root',password='123',
                               database='db1',charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "select * from table1"
        res = cursor.fetchall()
        # 取出来的是一个列表里面套字典的形式,我们需要拿出我们需要的值进行字符串拼接
        r_list = []
        for r in res:
            s = '<tr><td>%s</td><td>%s</td></tr>'%(r['name'],r['pwd'])
            r_list.append(s)
        # 全部添加完之后再做一个整体的拼接
        need = ''.join(r_list)
        # 拼接好之后进行替换出我们之前html中的占位字符
        res = data.replace('@@content@@',need)
        # 替换好之后可以把信息返回给浏览器了
        return bytes(res,encoding='utf-8')
    server服务端

    使用第三方工具jinja2

    def home():
        # 返回静态页面
        # 先读出静态html文件
        f = open('静态页面.html','r')
        data = f.read()
        f.close()
        return bytes(data,encoding='utf-8')
    
    
    def index():
        # 也要先读出html页面
        f = open('静态页面.html', 'r')
        data = f.read()
        f.close()
    
        # 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具)
        # 链接数据库,取出想要的数据
        import pymysql
        conn = pymysql.connect(host='127.0.0.1',user='root',password='123',
                               database='db1',charset='utf8')
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "select * from table1"
        res = cursor.fetchall()
    
    
        # 第二种模板引擎渲染是通过第三方的工具,这里用的是jinja2
        from jinja2 import Template
        template = Template(data)
        res = template.render(user= res) # 这里需要把key和html里的占位符对应好
        return bytes(res,encoding='utf-8')
    server服务端
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>渲染模板</title>
    </head>
    <body>
    <table>
    <!--    这里的占位符是{{name}} 外面传值必须通过key,value传值, key需要与占位字符一致 -->
            {{name}}
    <!--    如果外面传进来列表,在这里也可以循环-->
        {% for k in name %}
    <!--    如果循环出来的k是字典,可以用点key进行取值-->
            <td>{{k.name}}</td>
        {% endfor %}
    </table>
    
    </body>
    </html>
    渲染的页面
  • 相关阅读:
    spring boot的actuator
    mongo的用户角色配置
    spring boot使用AOP统一处理web请求
    (原)luarocks install 提示 failed fetching manifest
    (原)ubuntu中安装kate
    (原+转)Ubuntu16.04软件中心闪退及wifi消失
    (原)torch使用caffe时,提示CUDNN_STATUS_EXECUTION_FAILED
    (原)torch中微调某层参数
    (原)torch的apply函数
    (原)torch的训练过程
  • 原文地址:https://www.cnblogs.com/hesujian/p/11160247.html
Copyright © 2020-2023  润新知