码迷,mamicode.com
首页 > Web开发 > 详细

自定义web框架

时间:2019-01-14 21:23:24      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:设置   %s   content   定义   http get   break   sim   png   hal   

 

HTTP GET 请求格式:

技术分享图片

 

 

HTTP响应的格式:

技术分享图片




 

 

返回具体的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     # 按\r\n分割  
    41     data1 = data.split("\r\n")[0]  
    42     url = data1.split()[1]  # url是我们从浏览器发过来的消息中分离出的访问路径  
    43     conn.send(bHTTP/1.1 200 OK\r\n\r\n)  # 因为要遵循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()

 

自定义web框架

标签:设置   %s   content   定义   http get   break   sim   png   hal   

原文地址:https://www.cnblogs.com/WHWWHW/p/10268724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!