• 框架


    HTTP请求格式:

    HTTP响应的格式:




    HTTP协议

    1.请求方式八种: GET POST DELTE PUT OPTIONS HEAD

    2.状态码:

      1XX 

      2XX   200 OK

      3XX   重定向 301  302

        4XX请求的错误

      5XX服务器的错误

    3.URL :

      http://www.cnblogs.com /guobaoyuan?k1=v1&k2=v2

        

    返回具体的HTML文件:

    我们可以打开HTML文件,读取出它内部的二进制数据,然后再发送给浏览器。

    1.  1 """ 
       2 根据URL中不同的路径返回不同的内容--函数进阶版 
       3 返回独立的HTML页面 
       4 """  
       5   
       6 import socket  
       7   
       8 sk = socket.socket()  
       9 sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口  
      10 sk.listen()  # 监听  
      11   
      12   
      13 # 将返回不同的内容部分封装成不同的函数  
      14 def index(url):  
      15     # 读取index.html页面的内容  
      16     with open("index.html", "r", encoding="utf8") as f:  
      17         s = f.read()  
      18     # 返回字节数据  
      19     return bytes(s, encoding="utf8")  
      20   
      21   
      22 def home(url):  
      23     with open("home.html", "r", encoding="utf8") as f:  
      24         s = f.read()  
      25     return bytes(s, encoding="utf8")  
      26   
      27   
      28 # 定义一个url和实际要执行的函数的对应关系  
      29 list1 = [  
      30     ("/index/", index),  
      31     ("/home/", home),  
      32 ]  
      33   
      34 while True:  
      35     # 等待连接  
      36     conn, add = sk.accept()  
      37     data = conn.recv(8096)  # 接收客户端发来的消息  
      38     # 从data中取到路径  
      39     data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串  
      40     # 按
      分割  
      41     data1 = data.split("
      ")[0]  
      42     url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径  
      43     conn.send(b'HTTP/1.1 200 OK
      
      ')  # 因为要遵循HTTP协议,所以回复的消息也要加状态行  
      44     # 根据不同的路径返回不同内容  
      45     func = None  # 定义一个保存将要执行的函数名的变量  
      46     for item in list1:  
      47         if item[0] == url:  
      48             func = item[1]  
      49             break  
      50     if func:  
      51         response = func(url)  
      52     else:  
      53         response = b"404 not found!"  
      54   
      55     # 返回具体的响应消息  
      56     conn.send(response)  
      57     conn.close()  



    利用wsgiref模块替换我们写的web框架的socket server 部分:

     1 """  
     2 根据URL中不同的路径返回不同的内容--函数进阶版  
     3 返回HTML页面  
     4 让网页动态起来  
     5 wsgiref模块版  
     6 """   
     7      
     8 from wsgiref.simple_server import make_server   
     9      
    10      
    11 # 将返回不同的内容部分封装成函数   
    12 def index(url):   
    13     # 读取index.html页面的内容   
    14     with open("index.html", "r", encoding="utf8") as f:   
    15         s = f.read()   
    16     # 返回字节数据   
    17     return bytes(s, encoding="utf8")   
    18      
    19      
    20 def home(url):   
    21     with open("home.html", "r", encoding="utf8") as f:   
    22         s = f.read()   
    23     return bytes(s, encoding="utf8")   
    24      
    25      
    26 def timer(url):   
    27     import time   
    28     with open("time.html", "r", encoding="utf8") as f:   
    29         s = f.read()   
    30         s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))   
    31     return bytes(s, encoding="utf8")   
    32      
    33      
    34 # 定义一个url和实际要执行的函数的对应关系   
    35 list1 = [   
    36     ("/index/", index),   
    37     ("/home/", home),   
    38     ("/time/", timer),   
    39 ]   
    40      
    41      
    42 def run_server(environ, start_response):   
    43     start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息   
    44     url = environ['PATH_INFO']  # 取到用户输入的url   
    45     func = None   
    46     for i in list1:   
    47         if i[0] == url:   
    48             func = i[1]   
    49             break   
    50     if func:   
    51         response = func(url)   
    52     else:   
    53         response = b"404 not found!"   
    54     return [response, ]   
    55      
    56      
    57 if __name__ == '__main__':   
    58     httpd = make_server('127.0.0.1', 8090, run_server)   
    59     print("我在8090等你哦...")   
    60     httpd.serve_forever()  



    jinja2:

    上面的代码实现了一个简单的动态,我完全可以从数据库中查询数据,然后去替换我html中的对应内容,然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2

    下载jinja2:

    pip install jinja2



    index2 文件:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Title</title>
    </head>
    <body>
        <h1>姓名:{{name}}</h1>
        <h1>爱好:</h1>
        <ul>
            {% for hobby in hobby_list %}
            <li>{{hobby}}</li>
            {% endfor %}
        </ul>
    </body>
    </html>

    使用jinja2渲染index2.html文件:

    from wsgiref.simple_server import make_server  
    from jinja2 import Template  
      
      
    def index(url):  
        # 读取HTML文件内容  
        with open("index2.html", "r", encoding="utf8") as f:  
            data = f.read()  
            template = Template(data)   # 生成模板文件  
            ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']})   # 把数据填充到模板中  
        return bytes(ret, encoding="utf8")  
      
      
    def home(url):  
        with open("home.html", "r", encoding="utf8") as f:  
            s = f.read()  
        return bytes(s, encoding="utf8")  
      
      
    # 定义一个url和实际要执行的函数的对应关系  
    list1 = [  
        ("/index/", index),  
        ("/home/", home),  
    ]  
      
      
    def run_server(environ, start_response):  
        start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息  
        url = environ['PATH_INFO']  # 取到用户输入的url  
        func = None  
        for i in list1:  
            if i[0] == url:  
                func = i[1]  
                break  
        if func:  
            response = func(url)  
        else:  
            response = b"404 not found!"  
        return [response, ]  
      
      
    if __name__ == '__main__':  
        httpd = make_server('127.0.0.1', 8090, run_server)  
        print("我在8090等你哦...")  
        httpd.serve_forever()  



    使用pymysql连接数据库:

    conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select name, age, department_id from userinfo")
    user_list = cursor.fetchall()
    cursor.close()
    conn.close()
  • 相关阅读:
    优化慢执行或慢查询的方法
    Top K问题的两种解决思路
    优先队列实现 大小根堆 解决top k 问题
    进程间的八种通信方式----共享内存是最快的 IPC 方式
    二叉树基础之按层打印
    按层打印二叉树--每行打印一层
    给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
    缓存与数据库一致性保证
    一致性哈希算法原理
    Linux复制指定目录下的文件夹结构
  • 原文地址:https://www.cnblogs.com/WHWWHW/p/10268724.html
Copyright © 2020-2023  润新知