静态、动态资源实现+mini-web框架(python篇)

使用多线程来实现一个简单的web服务,根据前端请求地址的不同,后台服务器选择不同的显示方式

代码中涉及到类、socket套接字、正则表达式

wsgi协议使用注意事项:

1、框架文件中需要存在一个application(字典, 函数名)方法,入参一个字典和一个引用函数

2、第一个字段参数是服务器传过来的需要处理的url地址或者其他信息

3、第二个函数名参数,是服务器用来处理的header的函数(函数由服务器提供,即在服务器代码中创建后传给框架代码)

服务器代码:

import socket
import multiprocessing
import re
from 多进程web服务器 import web框架层


# 创建服务器类
class MSGIServer:
    def __init__(self):
        # 1、创建套接字
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 2、绑定ip及port
        self.tcp_socket.bind(('', 7890))
        # 3、监听
        self.tcp_socket.listen(128)

    def client_server(self, new_socket):
        """处理客户端请求,以及返回客户端请求"""
        # 处理客户端发送来的数据,request
        request = new_socket.recv(1024).decode('gbk')
        print(str(request).splitlines()[0])
        # 使用正则提取请求url地址的后缀名,用于判断执行静态还是动态代码
        file_name = re.match('.*/.*\.([a-z]*)\sH', str(request).splitlines()[0]).group(1)
        # 使用正则提取请求的url地址,用于后面代码中进行匹配
        page_name = re.match('.*/(.*)\sH', str(request).splitlines()[0]).group(1)
        # 返回数据给客户端
        # 根据请求的url地址的不同,返回不同的数据,html(静态)或者py文件(动态)
        if file_name=='html':
            response = "HTTP/1.1 200 OK \r\n"
            response += '\r\n'
            response += "<h1>Hello world</h1>"
            new_socket.send(response.encode('gbk'))
        elif file_name == 'py':
            env = dict()
            env['path'] = page_name
            # 调用框架模块中的application方法,传入url信息,确定执行的命令
            body = web框架层.application(env, self.set_response)
            # response = "HTTP/1.1 200 OK \r\n"
            header = 'HTTP/1.1 %s\r\n' % self.status
            for temp in self.header:
                header += '%s:%s' % (temp[0], temp[1])
                header += '\r\n'
                print(header)

            response = header + '\r\n' + body

            new_socket.send(response.encode('gbk'))
        new_socket.close()

    # 设置请求头
    def set_response(self, status, headers):
        self.status = status
        self.header = headers

    def run_forver(self):
        """实现web服务器"""
        while True:
            # 4、等待新客户端的链接 accept
            new_socket, socket_address = self.tcp_socket.accept()
            # 5、为新客户端服务,独立为服务的方法处理接收和发送数据(request\response)
            p = multiprocessing.Process(target=self.client_server, args=(new_socket,))
            # client_server(new_socket)
            p.start()
            new_socket.close()
        self.tcp_socket.close()


def main():
    msgi_server = MSGIServer()
    msgi_server.run_forver()


if __name__ == '__main__':
    main()

框架代码:

import time

def login():
    """登录网页"""
    return '----这里是登录页面哦%s-----' % time.ctime()


def register():
    """注册页面"""
    return '----this is the register page%s-----' % time.ctime()

# 服务器代码调用执行的代码
def application(environ, start_response):
    start_response('200 OK', [('Context-Type', 'text/html')])
    page_name = environ['path']
    if page_name == 'login.py':
        return login()
    elif page_name == 'register.py':
        return register()

上述代码的实现效果就是,如果访问的是静态html页面,就显示html返回的网页内容。如果访问的是‘.py’的动态页面,就动态显示返回的内容,为了方便演示,所以动态页面中加入了时间模块,每次刷新之后时间会自动更新

 

为什么要使用框架来设计web服务?

为了提高代码的耦合性,所以不能将所有的代码放在一个文件中执行完。鸡蛋放在一个篮子里的后果就是风险太高,所以框架的思想就是降低风险,提高代码耦合度。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值