自己实现 web框架

首先要有 socket  【代码如下】

1 import socket 2 sk= socket.socket() 3 sk.bind(("192.168.11.56",8085)) 4 sk.listen(5) 5 while True: 6 conn,addr = sk.accept() 7 data = conn.recv(8096) 8 conn.send(b"OK") 9 conn.close()

 1 import socket
 2 
 3 sk = socket.socket()
 4 sk.bind(("127.0.0.1", 8080))
 5 sk.listen(5)
 6 
 7 while True:
 8     conn, addr = sk.accept()  # 夯在此地,等待链接
 9     data = conn.recv(8096)
10     print(data)
11     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
12     conn.send(bytes("<h1>hello...你好啊~</h1>", encoding="utf-8"))  # 响应体
13     conn.close()

需求一:不同的url,返回不同的内容 【意思就是访问主页就返回主页 访问个人中心就返回个人中心】

                 【利用请求头的第一行中间那个位置,会又请求具体的URL】

                 【利用字符串分割】

 1 """
 2 不同的URL,返回不同的内容
 3 """
 4 import socket
 5 
 6 sk = socket.socket()
 7 sk.bind(("127.0.0.1", 8080))
 8 sk.listen(5)
 9 
10 while True:
11     conn, addr = sk.accept()  # 夯在此地,等待链接
12     data = conn.recv(8096)
13     # 类型转换 字节类型-->字符串
14     data_str = str(data, encoding="utf-8")
15     # 取到请求头
16     header = data_str.split("\r\n\r\n")[0]
17     # 再取到 “GET / HTTP/1.1”
18     tmp = header.split("\r\n")[0]
19     # 再按照空格分割,得到列表,取索引值是1的
20     url = tmp.split(" ")[1]
21     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
22     # 根据请求URL的不同,我返回不同的内容
23     if url == "/index/":
24         response = "这是主页。。。"
25     else:
26         response = "404"
27     conn.send(bytes(response, encoding="utf-8"))  # 响应体
28     conn.close()

需求二:当页面太多,我又不可能挨个写if 判断

      【for循坏来处理】

 1 import socket
 2 
 3 sk = socket.socket()
 4 sk.bind(("127.0.0.1", 8080))
 5 sk.listen(5)
 6 
 7 def index():
 8     return "这是主页"
 9 
10 def info():
11     return "这是个人信息页"
12 
13 
14 url_func_map = [
15     ("/index/", index),
16     ("/info/", info)
17 ]
18 
19 
20 while True:
21     conn, addr = sk.accept()  # 夯在此地,等待链接
22     data = conn.recv(8096)
23     # 类型转换 字节类型-->字符串
24     data_str = str(data, encoding="utf-8")
25     # 取到请求头
26     header = data_str.split("\r\n\r\n")[0]
27     # 再取到 “GET / HTTP/1.1”
28     tmp = header.split("\r\n")[0]
29     # 再按照空格分割,得到列表,取索引值是1的
30     url = tmp.split(" ")[1]
31     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
32     # 根据请求URL的不同,我返回不同的内容
33     func_name = None  # 定义一个存放将要执行函数的变量
34     # for循环url_func_map
35     for i in url_func_map:
36         if i[0]  == url:
37             func_name = i[1]
38             break
39     if func_name:
40         response = func_name()
41     else:
42         response = "404"
43     conn.send(bytes(response, encoding="utf-8"))  # 响应体
44     conn.close()

需求三:返回的内容要是我写好html文件    

      【with poen(“xx.html”,encoding=“utf-8”)as f:f.read()】【处理逻辑,打开在读取】

 1 """
 2 不同的URL,返回不同的内容
 3 返回的内容要是我写好的html文件
 4 """
 5 import socket
 6 
 7 sk = socket.socket()
 8 sk.bind(("127.0.0.1", 8080))
 9 sk.listen(5)
10 
11 def login():
12     with open("login.html", encoding="utf-8") as f:
13         data = f.read()
14     return data
15 
16 def index():
17     with open("index.html", encoding="utf-8") as f:
18         data = f.read()
19     return data
20 
21 def info():
22     return "这是个人信息页"
23 
24 
25 url_func_map = [
26     ("/login/", login),
27     ("/index/", index),
28     ("/info/", info)
29 ]
30 
31 
32 while True:
33     conn, addr = sk.accept()  # 夯在此地,等待链接
34     data = conn.recv(8096)
35     # 类型转换 字节类型-->字符串
36     data_str = str(data, encoding="utf-8")
37     # 取到请求头
38     header = data_str.split("\r\n\r\n")[0]
39     # 再取到 “GET / HTTP/1.1”
40     tmp = header.split("\r\n")[0]
41     # 再按照空格分割,得到列表,取索引值是1的
42     url = tmp.split(" ")[1]
43     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
44     # 根据请求URL的不同,我返回不同的内容
45     func_name = None  # 定义一个存放将要执行函数的变量
46     # for循环url_func_map
47     for i in url_func_map:
48         if i[0]  == url:
49             func_name = i[1]
50             break
51     if func_name:
52         response = func_name()
53     else:
54         response = "404"
55     conn.send(bytes(response, encoding="utf-8"))  # 响应体
56     conn.close()

需求四:静态网站都是死页面,我们现在要实现一个动态页面

 1 """
 2 不同的URL,返回不同的内容
 3 返回的内容要是我写好的html文件
 4 html里面的内容要动起来
 5 """
 6 import socket
 7 
 8 sk = socket.socket()
 9 sk.bind(("127.0.0.1", 8080))
10 sk.listen(5)
11 
12 def login():
13     with open("login.html", encoding="utf-8") as f:
14         data = f.read()
15     import time
16     time_s = str(time.time())
17     data_new = data.replace("@@xx@@", time_s)
18     return data_new
19 
20 def index():
21     with open("index.html", encoding="utf-8") as f:
22         data = f.read()
23     return data
24 
25 def info():
26     return "这是个人信息页"
27 
28 
29 url_func_map = [
30     ("/login/", login),
31     ("/index/", index),
32     ("/info/", info)
33 ]
34 
35 
36 while True:
37     conn, addr = sk.accept()  # 夯在此地,等待链接
38     data = conn.recv(8096)
39     # 类型转换 字节类型-->字符串
40     data_str = str(data, encoding="utf-8")
41     # 取到请求头
42     header = data_str.split("\r\n\r\n")[0]
43     # 再取到 “GET / HTTP/1.1”
44     tmp = header.split("\r\n")[0]
45     # 再按照空格分割,得到列表,取索引值是1的
46     url = tmp.split(" ")[1]
47     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
48     # 根据请求URL的不同,我返回不同的内容
49     func_name = None  # 定义一个存放将要执行函数的变量
50     # for循环url_func_map
51     for i in url_func_map:
52         if i[0]  == url:
53             func_name = i[1]
54             break
55     if func_name:
56         response = func_name()
57     else:
58         response = "404"
59     conn.send(bytes(response, encoding="utf-8"))  # 响应体
60     conn.close()

需求五:与数据库交互实现动态

    先导入数据库模块  【 import pymysql 】

       cdm  启动 数据库 mysql   -->>  show databases  【找到已有的库】 -->> use dayXX  【切到表】 -->> show tables  【查看表】

 

 1 """
 2 不同的URL,返回不同的内容
 3 返回的内容要是我写好的html文件
 4 html里面的内容要动起来
 5 数据要从数据库中查找
 6 """
 7 import socket
 8 
 9 sk = socket.socket()
10 sk.bind(("127.0.0.1", 8080))
11 sk.listen(5)
12 
13 def login():
14     with open("login.html", encoding="utf-8") as f:
15         data = f.read()
16     import time
17     time_s = str(time.time())
18     data_new = data.replace("@@xx@@", time_s)
19     return data_new
20 
21 def index():
22     with open("index.html", encoding="utf-8") as f:
23         data = f.read()
24     # 链接数据库,找数据
25     import pymysql
26     conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="", db="day48", charset="utf-8")
27     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
28     cursor.execute("select id, name, balance from user")
29     user_list = cursor.fetchall()
30     cursor.close()
31     conn.close()
32     """
33     <tr>
34         <td>id</td>
35         <td>name</td>
36         <td>balance</td>
37     </tr>
38     """
39     ret = ""
40     for i in user_list:
41         ret +=  """
42             <tr>
43                 <td>{0}</td>
44                 <td>{1}</td>
45                 <td>{2}</td>
46             </tr>
47         """.format(i["id"], i["name"], i["balance"])
48     data_new = data.replace("@@xx@@", ret)
49     return data_new
50 
51 
52 def info():
53     return "这是个人信息页"
54 
55 
56 url_func_map = [
57     ("/login/", login),
58     ("/index/", index),
59     ("/info/", info)
60 ]
61 
62 
63 while True:
64     conn, addr = sk.accept()  # 夯在此地,等待链接
65     data = conn.recv(8096)
66     # 类型转换 字节类型-->字符串
67     data_str = str(data, encoding="utf-8")
68     # 取到请求头
69     header = data_str.split("\r\n\r\n")[0]
70     # 再取到 “GET / HTTP/1.1”
71     tmp = header.split("\r\n")[0]
72     # 再按照空格分割,得到列表,取索引值是1的
73     url = tmp.split(" ")[1]
74     conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")  # 响应头
75     # 根据请求URL的不同,我返回不同的内容
76     func_name = None  # 定义一个存放将要执行函数的变量
77     # for循环url_func_map
78     for i in url_func_map:
79         if i[0]  == url:
80             func_name = i[1]
81             break
82     if func_name:
83         response = func_name()
84     else:
85         response = "404"
86     conn.send(bytes(response, encoding="utf-8"))  # 响应体
87     conn.close()

pycharm链接数据库:

user:root 【 不是表  图写错了】

 

posted @ 2017-11-25 16:22  敌说  阅读(42)  评论(0)    收藏  举报