zoukankan      html  css  js  c++  java
  • 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 
     4 import socket
     5 import select
     6 
     7 
     8 class MyRequest:
     9     """
    10     从请求头请求体获取的信息封装的request对象中
    11     """
    12     def __init__(self,data):
    13         header_body=data.decode('utf-8')
    14         header_str,body_str=header_body.split('
    
    ')
    15         header_list=header_str.split('
    ')
    16         method,url,protocal=header_list[0].split(' ')
    17 
    18         header_dict={}
    19 
    20         for i in range(1,len(header_list)):
    21             k,v =header_list[i].split(':',1)
    22             header_dict[k]=v
    23 
    24         self.method=method
    25         self.url=url
    26         self.headers=header_dict
    27 
    28 
    29 class MyResponse:
    30     """
    31     处理服务端要返回给浏览器的数据,相当于HTTPResponse或render
    32     """
    33     def __init__(self,data):
    34         self.data=data
    35         self.base_data='HTTP/1.1 200 OK
    
    <html><head><meta charset="UTF-8"></head><body><h1>{0}</h1></body></html>'
    36     def myrender(self):
    37         return self.base_data.format(self.data).encode('utf-8')
    38 
    39 
    40 #  下面2个简单的视图函数
    41 def index(request):
    42     return MyResponse('index page').myrender()
    43 
    44 def login(request):
    45     return MyResponse('login page').myrender()
    46 
    47 
    48 #  路由系统
    49 routers=[
    50     ['/index',index],
    51     ['/login',login],
    52 ]
    53 
    54 
    55 sk=socket.socket()
    56 sk.setblocking(False)
    57 sk.bind(('127.0.0.1',8080))
    58 sk.listen(5)
    59 
    60 inputs=[sk,]   #  套接字接听对象,是socket或conn的一个或多个
    61 
    62 while True:
    63     rList,wList,eList=select.select(inputs,[],[],2)
    64     #  读,写,错误  3个列表
    65     for server in rList:
    66         if server==sk:
    67             conn,addr=sk.accept()
    68             inputs.append(conn)
    69         else:
    70             header_body_bytes=server.recv(8096)
    71             request=MyRequest(header_body_bytes)
    72             view_method=None
    73             for view_function in routers:
    74                 #  根据请求url通过路由交给不同的视乎函数处理
    75                 if request.url == view_function[0]:
    76                     view_method=view_function[1]
    77                     break
    78             if not view_method:
    79                 response=MyResponse('404').myrender()
    80             else:
    81                 response=view_method(request)
    82             server.sendall(response)
    83             inputs.remove(server)
    84             server.close()
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from wsgiref.simple_server import make_server
    
    #  下面2个视图函数
    def indexfunc(request):
        f=open(r'templates/index.html','rb')
        data=f.read()
        f.close()
        print('执行了indexfunc')
        return [data]
    
    def loginfunc(request):
        request_method=request.get('REQUEST_METHOD')
        if request_method=='GET':
            f = open(r'templates/login.html', 'rb')
            data = f.read()
            f.close()
            print('执行了login')
            return [data]
    
    #  路由
    routers=[
        ('/index',indexfunc),
        ('/login',loginfunc),
             ]
    
    drouters=dict(routers)
    
    
    def application(environ,start_response):
        start_response('200 ok',[('Content-Type','text/html')])
        path=environ.get('PATH_INFO')
        print(path)
        if drouters.get(path):
            print('yeah')
            return drouters.get(path)(environ)
        else:
    
            return [b'<h1>404<h1>']
    
    t=make_server('127.0.0.1',8989,application)
    t.serve_forever()
    

      

  • 相关阅读:
    Linux 打印可变参数日志
    am335x system upgrade kernel f-ram fm25l16b(十六)
    spi signal analyze using logic analyzer
    learning armbian steps(3) ----- armbian 文件系统定制思路
    learning armbian steps(2) ----- armbian 镜像编译
    learning armbian steps(1) ----- armbian 入门知识基础学习
    create rootfs.img using loop device
    learning docker steps(8) ----- docker network 初次体验
    learning docker steps(7) ----- docker registry 搭建
    learning docker steps(6) ----- docker 镜像加速
  • 原文地址:https://www.cnblogs.com/ALXPS/p/8027067.html
Copyright © 2011-2022 走看看