Python高级——动态服务器实现

1. webserver.py
'''
这是完成的动态服务器
'''
import socket
# from . import app
import myapp
class HttpServer(object):
    def __init__(self, port):
        # socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 创建服务器套接字
        self.socket_server = socket.socket()

        # 绑定端口
        # 空字符串表示本地的任何一个IP地址都可以
        self.socket_server.bind(('', port))

        # 监听端口
        self.socket_server.listen()

        # 响应头数据
        self.response_data = ''

    def start(self):
        while True:
            self.socket_client, _ = self.socket_server.accept()
            self.handle_client()

    def handle_client(self):
        '''假设全部的请求都是动态资源'''

        # 解析请求报文
        request_data = self.socket_client.recv(1024)
        # 请求报文的格式是bytes类型, decode()将bytes转成str
        request_data_str = request_data.decode()
        request_data_list = request_data_str.split('\r\n')
        try:
            # 获取到请求报文的第一行数据
            first_line = request_data_list[0]
            url = first_line.split(' ')[1]
        except:
            # 如果获取不到请求报文,说明请求非法,直接关闭套接字,或者赋默认值
            url = '/'
        if url.endswith('.py'):
            print('请求的动态资源,交给框架处理')
            print(url)
            # 调用框架的接口,框架完成响应体数据,所以有返回值
            environment = {
                'url_info':url
            }
            response_body = myapp.app(environment, func=self.handle_response_headers)

            # 拼接响应报文
            response = self.response_data + response_body
            self.socket_client.send(response.encode('gbk'))

        else:
            print('请求的静态资源')
            response_first_line = 'HTTP/1.1 200 ok\r\n'
            response = response_first_line + '\r\n' + '静态页面'
            self.socket_client.send(response.encode('gbk'))

        # 拼接响应报文
    def handle_response_headers(self, status):
        # response_first_line = 'HTTP/1.1 %s\r\n'%status
        response_first_line = 'HTTP/1.1 ' + status + '\r\n'
        response = response_first_line + '\r\n'
        self.response_data = response

def main():
    s = HttpServer(8080)
    s.start()

if __name__ == '__main__':
    main()
2. myapp.py
'''
这是运行在服务器上的框架,用来处理动态资源
'''

route_list = [

]

def factory(url):
    def wrapper(func):
        global route_list
        route_list.append((url, func))
        def inner():
            data = func()
            return data
        return inner
    return wrapper

@factory('/login.py')
def login():
    print('登陆处理函数')
    return '登陆成功'

@factory('/register.py')
def register():
    print('注册处理函数')
    return '注册成功'


class Application2(object):
    def __call__(self, env, func, *args, **kwargs):
        path_info = env['url_info']
        for url, funcs in route_list:
            if url == path_info:
                response_body = funcs()
                func('200 ok')
                return response_body
        else:
            func('404 not found')
            return '路径错误'


class Application(object):
    def __call__(self, env, func, *args, **kwargs):
        print(env)
        url = env['url_info']
        try:
            info = url.split('?')[1].split('&')
            username = info[0]
            password = info[1][:-3]
            print(username, password)
            func('200 ok')
            return '登陆成功'
        except:
            func('404 not found')
            return '404 not found'

app = Application2()

def app2(env, func):
    '''
    接口,完成动态资源的获取
    :param env: 一般情况下是一个字典,里面封装了所有服务器传递过来的数据
    :return: 返回给服务器的资源数据
    '''
    print(env)
    url = env['url_info']
    try:
        info = url.split('?')[1].split('&')
        username = info[0]
        password = info[1][:-3]
        print(username, password)
        func('200 ok')
        return '登陆成功'
    except:
        func('404 not found')
        return '404 not found'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值