zoukankan      html  css  js  c++  java
  • Django之web本质

    Django之web本质

      Web的本质,是基于socket玩的。

      在我们上网的过程中,一个访问请求是如何工作的。

      Web的框架:

        网络的连接都是基于Socket

        在连接中有TCP/UDP 和HTTP协议

        HTTP协议是:无状态,短连接。(HTTP协议的访问状态是发送请求连接一次,返回请求结果数据一次,就断开连接)

        无状态体现在同样的请求者第二次发请求来,服务端不认识它。

        TCP:不断开,安全,不丢包,慢

        UDP:易丢包,快

      Web的工作流程:

      浏览器端(Socket客户端)

    2、域名或DNS正反解析出的IP,在浏览器中输入。
         在socket端创建Socket对象
         Socket.socket()
         在创建连接
         Socket.connet(("IP",端口))
         在发送连接请求
         socket.send("我想请求数据")
    
    5、接收响应的数据
    6、连接断开,完成一个HTTP请求

        网站服务端(Socket服务端)

    1、监听自己网站的IP和域名,while 循环监听
        while True:
            等待用户连接
            3、接收用户的连接请求("我想请求数据")
            4、响应用户的连接,给用户返回响应的数据("")
                 断开连接,等待下一个用户的连接请求  

      socket的服务端:

        web的最本质最基本简化的流程。

     1 import socket
     2 
     3 Socket = socket.socket()
     4 # 创建Socket对象
     5 
     6 Socket.bind(("127.0.0.1",8080))
     7 # 绑定IP和端口
     8 
     9 Socket.listen(5)
    10 # 监听等待5个连接
    11 
    12 while True:
    13     conn, addr = Socket.accept()
    14     # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    15 
    16     data = conn.recv(8096)
    17     # 获取数据
    18 
    19     print(data)
    20     # 打印一下data的获取数据的结果
    21 
    22     conn.send(b'HTTP/1.1 200 OK 
    
    ')
    23     # 响应头
    24 
    25     conn.send(b'123')
    26     # 响应的返回数据,响应体
    27 
    28     conn.close()
    29     # 断开连接

      HTTP协议:发送的数据和响应的数据是有相互的规则的,规则遵循HTTP协议。

        发送(Request):

          GET请求:

            GET请求头:

     1 数据在请求头的url中。在GET / /HTTP1.1 的第一个/后,也就是请求体(请求体Request Bodys)
     2 
     3 GET / HTTP/1.1
     4 Host: 127.0.0.1:8080
     5 Connection: keep-alive
     6 Cache-Control: max-age=0
     7 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
     8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
     9 HTTPS: 1
    10 Accept-Encoding: gzip, deflate, sdch
    11 Accept-Language: zh-CN,zh;q=0.8
    12 Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
    13 
    14 
    15 请求体部分

            GET请求体:数据在url中。 

    1 GET的请求体在GET / HTTP/1.1中的第一个 "/" 后。
    2 例如:
    3      GET /index?p=123 HTTP/1.1
    4      其中,index是url,这没错,but,p=123就是请求体。

          POST请求:

            POST请求头:

     1 POST /index HTTP/1.1
     2 Host: 127.0.0.1:8080
     3 Connection: keep-alive
     4 Cache-Control: max-age=0
     5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
     6 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
     7 HTTPS: 1
     8 Accept-Encoding: gzip, deflate, sdch
     9 Accept-Language: zh-CN,zh;q=0.8
    10 Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
    11  
    12  
    13 请求体部分

            POST请求体:

     1 POST /index HTTP/1.1
     2 Host: 127.0.0.1:8080
     3 Connection: keep-alive
     4 Cache-Control: max-age=0
     5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
     6 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
     7 HTTPS: 1
     8 Accept-Encoding: gzip, deflate, sdch
     9 Accept-Language: zh-CN,zh;q=0.8
    10 Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni
    11  
    12  
    13 p=123     #POST请求体内容

        响应(Response):

          响应头:

    在响应体中,要注意一个Status Code的状态码,应为200 OK
    
    响应头是在Response Headers中。
    
    响应头的数据:
          Cache-Control:public, max-age=15
          Connection:keep-alive
          Content-Encoding:gzip
          Content-Type:text/html; charset=utf-8
          Date:Wed, 14 Jun 2017 01:21:17 GMT
          Expires:Wed, 14 Jun 2017 01:21:33 GMT
          Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT
          Transfer-Encoding:chunked
          Vary:Accept-Encoding
          X-Frame-Options:SAMEORIGIN
          X-UA-Compatible:IE=10

          响应体:就是看到的前端页面,页面效果是浏览器解析的而已的啦。

      优化socket服务端流程,丰富功能:MK2

        分化url,不同的url,显示不同的内容。

     1 import socket
     2 
     3 Socket = socket.socket()
     4 # 创建Socket对象
     5 Socket.bind(("127.0.0.1",8080))
     6 # 绑定IP和端口
     7 Socket.listen(5)
     8 # 监听的次数
     9 while True:
    10 #监听循环
    11     conn, addr = Socket.accept()
    12     # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    13     data = conn.recv(8096)
    14     # 获取数据
    15     print(data)
    16     #打印拿到的请求数据
    17     data = str(data,encoding="utf-8")
    18     #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    19     Headers,Bodys = data.split("
    
    ")
    20     #将data数据用split以"
    
    "分割成请求头和请求体
    21     temp_list = Headers.split("
    ")
    22     #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    23     method,url,protocal = temp_list[0].split(" ")
    24     #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    25     conn.send(b'HTTP/1.1 200 OK 
    
    ')
    26     # 响应头
    27     if url == "/XXX":
    28         conn.send(b"asfafafas")
    29     elif url == "/BBB":
    30         conn.send(b"qqqqqq")
    31     else:
    32         conn.send(b"404 not found")
    33     conn.close()

      在获取的用户数据后,转换成数据类型,比如字符串,操作如下: 

      data拿到的一般都是字节byte类型的数据    

    data = str(data,encoding = "utf-8")

      即可将byte的数据类型,直接转换成字符串str的数据类型。

      在拿取请求头是,是根据 来分割开请求头和请求体的。

    1 headers,bodys = data.split("
    
    ")
    2 #这样可以将请求头和请求体分来。
    3  
    4 #在请求头中在进行分割:
    5 headers.split("
    ")

      对请求头再进一步的分割,可以将headers放在列表里,进行操作。这个的url是请求的url

    1 temp_list = Headers.split("
    ")
    2 #将Headers放进列表
    3 
    4 #在对请求头的第一行数据进行单独的操作,因为第一行数据不同。
    5 #GET / /HTTP1.1
    
    6 #定义GET为method,/后的请求体为url,是请求的url,/HTTP是协议protocal 
    7 method,url,protocal = temp_list[0].split(" ")
    8 #根据空格分割。

      MK3,将url抽离出,可单独操作每一个url。

     1 # Socket服务端
     2 import socket
     3 
     4 def index(request):
     5     return b'index'
     6 
     7 def func2(request):
     8     return b'func2'
     9 
    10 # 定义一个列表,里面存有url和url对应的函数名
    11 Routers = [
    12     ("/index",index), #url 为XXX时,执行func1函数
    13     ("/SSS",func2), #url 为SSS时,执行func2函数
    14 ]
    15 
    16 def run():
    17     """
    18     Socket服务端响应
    19     :return:
    20     """
    21     Socket = socket.socket()
    22     # 创建Socket对象
    23     Socket.bind(("127.0.0.1",8080))
    24     # 绑定IP和端口
    25     Socket.listen(5)
    26     # 监听的次数
    27     while True:
    28     #监听循环
    29         conn, addr = Socket.accept()
    30         # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    31         data = conn.recv(8096)
    32         # 获取数据
    33         print(data)
    34         #打印拿到的请求数据
    35         data = str(data,encoding="utf-8")
    36         #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    37         Headers,Bodys = data.split("
    
    ")
    38         #将data数据用split以"
    
    "分割成请求头和请求体
    39         temp_list = Headers.split("
    ")
    40         #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    41         method,url,protocal = temp_list[0].split(" ")
    42         #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    43         conn.send(b'HTTP/1.1 200 OK 
    
    ')
    44         # 响应头
    45         func_name = None
    46         #定义一个func_name,用于赋值item的func函数
    47         for item in Routers:
    48         #循环遍历Routers列表里的url。
    49             if item[0] == url:
    50             #取出url进行判断
    51                 func_name = item[1]
    52                 #如果匹配到func指定的函数
    53                 break
    54         if func_name:
    55         #如果func_name=True,存在,就拿func_name 的值
    56             response = func_name(data)
    57         else:
    58             response = b"404 Not Found"
    59         conn.send(response)
    60         #发送Response的值给作为响应体
    61         conn.close()
    62 
    63 
    64 if __name__ == "__main__":
    65     run()

      结果:

      --->--->

      MK4 优化函数的功能,丰富页面的内容:静态网站

       index页面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>index</title>
     6 </head>
     7 <body>
     8     <h1>Login</h1>
     9     <form>
    10         <p><input type="text" placeholder="Username"></p>
    11         <p><input type="password" placeholder="Password"></p>
    12     </form>
    13 </body>
    14 </html>

       func2页面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>article</title>
     6 </head>
     7 <body>
     8     <table border='1'>
     9         <thead>
    10             <tr>
    11                 <th>ID</th>
    12                 <th>Username</th>
    13                 <th>Email</th>
    14             </tr>
    15         </thead>
    16         <tbody>
    17             <tr>
    18                 <th>0001</th>
    19                 <th>George</th>
    20                 <th>George@G.com</th>
    21             </tr>
    22         </tbody>
    23     </table>
    24 </body>
    25 </html>

       socket端代码:

     1 # Socket服务端
     2 import socket
     3 
     4 def index(request):
     5     """
     6     处理用户请求,并返回响应数据
     7     :param request: 用户请求的所有信息
     8     :return:
     9     """
    10     f = open("index.html","rb")
    11     data = f.read()
    12     f.close()
    13     return data
    14 
    15 def func2(request):
    16     """
    17     处理用户请求,并返回响应数据
    18     :param request: 用户请求的所有信息
    19     :return:
    20     """
    21     f = open("article.html","rb")
    22     data = f.read()
    23     f.close()
    24     return data
    25 
    26 
    27 # 定义一个列表,里面存有url和url对应的函数名
    28 Routers = [
    29     ("/index",index), #url 为XXX时,执行func1函数
    30     ("/SSS",func2), #url 为SSS时,执行func2函数
    31 ]
    32 
    33 def run():
    34     """
    35     Socket服务端响应
    36     :return:
    37     """
    38     Socket = socket.socket()
    39     # 创建Socket对象
    40     Socket.bind(("127.0.0.1",8080))
    41     # 绑定IP和端口
    42     Socket.listen(5)
    43     # 监听的次数
    44     while True:
    45     #监听循环
    46         conn, addr = Socket.accept()
    47         # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    48         data = conn.recv(8096)
    49         # 获取数据
    50         print(data)
    51         #打印拿到的请求数据
    52         data = str(data,encoding="utf-8")
    53         #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    54         Headers,Bodys = data.split("
    
    ")
    55         #将data数据用split以"
    
    "分割成请求头和请求体
    56         temp_list = Headers.split("
    ")
    57         #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    58         method,url,protocal = temp_list[0].split(" ")
    59         #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    60         conn.send(b'HTTP/1.1 200 OK 
    
    ')
    61         # 响应头
    62         func_name = None
    63         #定义一个func_name,用于赋值item的func函数
    64         for item in Routers:
    65         #循环遍历Routers列表里的url。
    66             if item[0] == url:
    67             #取出url进行判断
    68                 func_name = item[1]
    69                 #如果匹配到func指定的函数
    70                 break
    71         if func_name:
    72         #如果func_name=True,存在,就拿func_name 的值
    73             response = func_name(data)
    74         else:
    75             response = b"404 Not Found"
    76         conn.send(response)
    77         #发送Response的值给作为响应体
    78         conn.close()
    79 
    80 
    81 if __name__ == "__main__":
    82     run()

      结果:

    ---》-->

      MK5 静态变动态。简单动态。

        以func2函数演示,获取系统时间,以实现动态效果。

      socket端,重点在func2函数:

     1 # Socket服务端
     2 import socket
     3 
     4 def index(request):
     5     """
     6     处理用户请求,并返回响应数据
     7     :param request: 用户请求的所有信息
     8     :return:
     9     """
    10     f = open("index.html","rb")
    11     data = f.read()
    12     f.close()
    13     return data
    14 
    15 def func2(request):
    16     """
    17     处理用户请求,并返回响应数据
    18     :param request: 用户请求的所有信息
    19     :return:
    20     """
    21     f = open("article.html","r")
    22     data = f.read()
    23     f.close()
    24     import time
    25     #导入时间模块
    26     ctime = time.time()
    27     #获取当期时间
    28     data = data.replace("@@sw@@",str(ctime))
    29     #将当期时间与前端的标签位进行替换
    30     return bytes(data,encoding="utf-8")
    31 
    32 
    33 # 定义一个列表,里面存有url和url对应的函数名
    34 Routers = [
    35     ("/index",index), #url 为XXX时,执行func1函数
    36     ("/SSS",func2), #url 为SSS时,执行func2函数
    37 ]
    38 
    39 def run():
    40     """
    41     Socket服务端响应
    42     :return:
    43     """
    44     Socket = socket.socket()
    45     # 创建Socket对象
    46     Socket.bind(("127.0.0.1",8080))
    47     # 绑定IP和端口
    48     Socket.listen(5)
    49     # 监听的次数
    50     while True:
    51     #监听循环
    52         conn, addr = Socket.accept()
    53         # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    54         data = conn.recv(8096)
    55         # 获取数据
    56         print(data)
    57         #打印拿到的请求数据
    58         data = str(data,encoding="utf-8")
    59         #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    60         Headers,Bodys = data.split("
    
    ")
    61         #将data数据用split以"
    
    "分割成请求头和请求体
    62         temp_list = Headers.split("
    ")
    63         #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    64         method,url,protocal = temp_list[0].split(" ")
    65         #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    66         conn.send(b'HTTP/1.1 200 OK 
    
    ')
    67         # 响应头
    68         func_name = None
    69         #定义一个func_name,用于赋值item的func函数
    70         for item in Routers:
    71         #循环遍历Routers列表里的url。
    72             if item[0] == url:
    73             #取出url进行判断
    74                 func_name = item[1]
    75                 #如果匹配到func指定的函数
    76                 break
    77         if func_name:
    78         #如果func_name=True,存在,就拿func_name 的值
    79             response = func_name(data)
    80         else:
    81             response = b"404 Not Found"
    82         conn.send(response)
    83         #发送Response的值给作为响应体
    84         conn.close()
    85 
    86 
    87 if __name__ == "__main__":
    88     run()

      func2的页面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>article</title>
     6 </head>
     7 <body>
     8     <table border="2">
     9         <thead>
    10             <tr>
    11                 <th>ID</th>
    12                 <th>Username</th>
    13                 <th>Email</th>
    14             </tr>
    15         </thead>
    16         <tbody>
    17             <tr>
    18                 <th>0001</th>
    19                 <th>@@sw@@</th>
    20                 <th>George@G.com</th>
    21             </tr>
    22         </tbody>
    23     </table>
    24 </body>
    25 </html>

      结果:

      

       MK6,动态获取数据改为数据库获取。

         重点在func3函数,要链接数据库。

         socket端:

      1 # Socket服务端
      2 import socket
      3 
      4 def index(request):
      5     """
      6     处理用户请求,并返回响应数据
      7     :param request: 用户请求的所有信息
      8     :return:
      9     """
     10     f = open("index.html","rb")
     11     data = f.read()
     12     f.close()
     13     return data
     14 
     15 def func2(request):
     16     """
     17     处理用户请求,并返回响应数据
     18     :param request: 用户请求的所有信息
     19     :return:
     20     """
     21     f = open("article.html","r")
     22     data = f.read()
     23     f.close()
     24     import time
     25     #导入时间模块
     26     ctime = time.time()
     27     #获取当期时间
     28     data = data.replace("@@sw@@",str(ctime))
     29     #将当期时间与前端的标签位进行替换
     30     return bytes(data,encoding="utf-8")
     31 
     32 def func3(request):
     33     """
     34     处理用户请求,并返回响应数据
     35     :param request: 用户请求的所有信息
     36     :return:
     37     """
     38     import pymysql
     39     conn = pymysql.connect(host = '127.0.0.1',port=3306,user="root",password="密码",db="数据库名")
     40     #创建连接
     41     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     42     #创建游标
     43     effect_row = cursor.execute("select id,name,password from user")
     44     #执行SQL语句,并返回结果
     45     userlist = cursor.fetchall()
     46     #拿到的所有数据
     47     cursor.close()
     48     #关闭游标
     49     conn.close()
     50     #关闭连接
     51     print(userlist)
     52     #打印user_list字典
     53     """
     54     将user_list拼接成如下的字符串,将字典的每一个值对应发给每一个标签
     55     [
     56         {id,name,password}
     57         {id,...}
     58         {id,...}
     59     ]
     60     
     61     <tr>
     62         <td>%s</td>  #id
     63         <td>%s</td>  #name
     64         <td>%s</td>  #password
     65     </tr>
     66     """
     67     content_list = []
     68     for row in userlist:
     69     #每一个row都是一行数据
     70         tp = '<tr><td>%s</td><td>%s</td><td>%s</td></tr>' %(row['id'],row['name'],row['password'])
     71         #字符串拼接
     72         content_list.append(tp)
     73     content = "".join(content_list)
     74     f = open("user_list.html", "r",encoding='utf-8')
     75     template = f.read()
     76     f.close()
     77     #模块的渲染,
     78     data = template.replace('@@XXXXX@@',content)
     79     return bytes(data, encoding="utf-8")
     80 
     81 
     82 # 定义一个列表,里面存有url和url对应的函数名
     83 Routers = [
     84     ("/index",index), #url 为XXX时,执行func1函数
     85     ("/SSS",func2), #url 为SSS时,执行func2函数
     86     ("/hhh",func3), #url 为hhh时,执行func3函数
     87 ]
     88 
     89 def run():
     90     """
     91     Socket服务端响应
     92     :return:
     93     """
     94     Socket = socket.socket()
     95     # 创建Socket对象
     96     Socket.bind(("127.0.0.1",8080))
     97     # 绑定IP和端口
     98     Socket.listen(5)
     99     # 监听的次数
    100     while True:
    101     #监听循环
    102         conn, addr = Socket.accept()
    103         # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    104         data = conn.recv(8096)
    105         # 获取数据
    106         print(data)
    107         #打印拿到的请求数据
    108         data = str(data,encoding="utf-8")
    109         #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    110         Headers,Bodys = data.split("
    
    ")
    111         #将data数据用split以"
    
    "分割成请求头和请求体
    112         temp_list = Headers.split("
    ")
    113         #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    114         method,url,protocal = temp_list[0].split(" ")
    115         #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    116         conn.send(b'HTTP/1.1 200 OK 
    
    ')
    117         # 响应头
    118         func_name = None
    119         #定义一个func_name,用于赋值item的func函数
    120         for item in Routers:
    121         #循环遍历Routers列表里的url。
    122             if item[0] == url:
    123             #取出url进行判断
    124                 func_name = item[1]
    125                 #如果匹配到func指定的函数
    126                 break
    127         if func_name:
    128         #如果func_name=True,存在,就拿func_name 的值
    129             response = func_name(data)
    130         else:
    131             response = b"404 Not Found"
    132         conn.send(response)
    133         #发送Response的值给作为响应体
    134         conn.close()
    135 
    136 
    137 if __name__ == "__main__":
    138     run()

      use_list.html  函数3的页面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>user_list</title>
     6 </head>
     7 <body>
     8     <table border="2">
     9         <thead>
    10             <tr>
    11                 <th>ID</th>
    12                 <th>Username</th>
    13                 <th>Email</th>
    14             </tr>
    15         </thead>
    16         <tbody>
    17             @@XXXXX@@
    18         </tbody>
    19     </table>
    20 </body>
    21 </html>

     结果: 更改数据库name栏数据,图中username栏的数据会跟随变化。

       MK7 优化函数func3中处理的繁琐字符串 :做模板渲染的 jinja2 模块。

       重点func4函数:

      func4函数的页面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>func4</title>
     6 </head>
     7 <body>
     8     <table border="1">
     9         <thead>
    10             <tr>
    11                 <th>ID</th>
    12                 <th>用户名</th>
    13                 <th>邮箱</th>
    14             </tr>
    15         </thead>
    16         <tbody>
    17             {% for row in xxxxx %}
    18                 <tr>
    19                     <td>{{row.id}}</td>
    20                     <td>{{row.name}}</td>
    21                     <td>{{row.password}}</td>
    22                 </tr>
    23             {% endfor %}
    24         </tbody>
    25     </table>
    26     {{user}}
    27 </body>
    28 </html>

      socket端:

      1 # Socket服务端
      2 import socket
      3 
      4 def index(request):
      5     """
      6     处理用户请求,并返回响应数据
      7     :param request: 用户请求的所有信息
      8     :return:
      9     """
     10     f = open("index.html","rb")
     11     data = f.read()
     12     f.close()
     13     return data
     14 
     15 def func2(request):
     16     """
     17     处理用户请求,并返回响应数据
     18     :param request: 用户请求的所有信息
     19     :return:
     20     """
     21     f = open("article.html","r")
     22     data = f.read()
     23     f.close()
     24     import time
     25     #导入时间模块
     26     ctime = time.time()
     27     #获取当期时间
     28     data = data.replace("@@sw@@",str(ctime))
     29     #将当期时间与前端的标签位进行替换
     30     return bytes(data,encoding="utf-8")
     31 
     32 def func3(request):
     33     """
     34     处理用户请求,并返回响应数据
     35     :param request: 用户请求的所有信息
     36     :return:
     37     """
     38     import pymysql
     39     conn = pymysql.connect(host = '127.0.0.1',port=3306,user="root",password="密码",db="数据库名")
     40     #创建连接
     41     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     42     #创建游标
     43     effect_row = cursor.execute("select id,name,password from user")
     44     #执行SQL语句,并返回结果
     45     userlist = cursor.fetchall()
     46     #拿到的所有数据
     47     cursor.close()
     48     #关闭游标
     49     conn.close()
     50     #关闭连接
     51     print(userlist)
     52     #打印user_list字典
     53     """
     54     将user_list拼接成如下的字符串,将字典的每一个值对应发给每一个标签
     55     [
     56         {id,name,password}
     57         {id,...}
     58         {id,...}
     59     ]
     60     
     61     <tr>
     62         <td>%s</td>  #id
     63         <td>%s</td>  #name
     64         <td>%s</td>  #password
     65     </tr>
     66     """
     67     content_list = []
     68     for row in userlist:
     69     #每一个row都是一行数据
     70         tp = '<tr><td>%s</td><td>%s</td><td>%s</td></tr>' %(row['id'],row['name'],row['password'])
     71         #字符串拼接
     72         content_list.append(tp)
     73     content = "".join(content_list)
     74     f = open("user_list.html", "r",encoding='utf-8')
     75     template = f.read()
     76     f.close()
     77     #模块的渲染,
     78     data = template.replace('@@XXXXX@@',content)
     79     return bytes(data, encoding="utf-8")
     80 
     81 def func4(request):
     82     """
     83     处理用户请求,并返回响应数据
     84     :param request: 用户请求的所有信息
     85     :return:
     86     """
     87     import pymysql
     88     conn = pymysql.connect(host='127.0.0.1', port=3306, user="root", password="redhat", db="GeorgeTest")
     89     # 创建连接
     90     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     91     # 创建游标
     92     effect_row = cursor.execute("select id,name,password from user")
     93     # 执行SQL语句,并返回结果
     94     userlist = cursor.fetchall()
     95     # 拿到的所有数据
     96     cursor.close()
     97     # 关闭游标
     98     conn.close()
     99     # 关闭连接
    100     f = open('func4.html','r',encoding='utf-8')
    101     data = f.read()
    102     f.close()
    103 
    104     # 基于第三方工具实现的模板渲染
    105     from jinja2 import Template
    106     template = Template(data)
    107     data = template.render(xxxxx=userlist,name='fadfasdfa')
    108     return data.encode('utf-8')
    109 
    110 
    111 # 定义一个列表,里面存有url和url对应的函数名
    112 Routers = [
    113     ("/index",index), #url 为XXX时,执行func1函数
    114     ("/SSS",func2), #url 为SSS时,执行func2函数
    115     ("/hhh",func3), #url 为hhh时,执行func3函数
    116     ("/func4",func4), #url 为func4时,执行func4函数
    117 ]
    118 
    119 def run():
    120     """
    121     Socket服务端响应
    122     :return:
    123     """
    124     Socket = socket.socket()
    125     # 创建Socket对象
    126     Socket.bind(("127.0.0.1",8080))
    127     # 绑定IP和端口
    128     Socket.listen(5)
    129     # 监听的次数
    130     while True:
    131     #监听循环
    132         conn, addr = Socket.accept()
    133         # 在这hold住,等待用户发送的请求,有人来连接,获取用户的发送数据
    134         data = conn.recv(8096)
    135         # 获取数据
    136         print(data)
    137         #打印拿到的请求数据
    138         data = str(data,encoding="utf-8")
    139         #将data的数据类型,由byte类型转换成str类型。并编码为utf-8。
    140         Headers,Bodys = data.split("
    
    ")
    141         #将data数据用split以"
    
    "分割成请求头和请求体
    142         temp_list = Headers.split("
    ")
    143         #将请求头以“
    ”分割,并且可以单独处理 [0] 的GET第一行,因为第一条的写法不同
    144         method,url,protocal = temp_list[0].split(" ")
    145         #将temp_list的 [0] 的内容分给请求方式,url和协议,以空格分开。url是请求的url
    146         conn.send(b'HTTP/1.1 200 OK 
    
    ')
    147         # 响应头
    148         func_name = None
    149         #定义一个func_name,用于赋值item的func函数
    150         for item in Routers:
    151         #循环遍历Routers列表里的url。
    152             if item[0] == url:
    153             #取出url进行判断
    154                 func_name = item[1]
    155                 #如果匹配到func指定的函数
    156                 break
    157         if func_name:
    158         #如果func_name=True,存在,就拿func_name 的值
    159             response = func_name(data)
    160         else:
    161             response = b"404 Not Found"
    162         conn.send(response)
    163         #发送Response的值给作为响应体
    164         conn.close()
    165 
    166 
    167 if __name__ == "__main__":
    168     run()

    结果:

    ------ END ------

      

  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/george92/p/9411532.html
Copyright © 2011-2022 走看看