【Python】简单Web框架从零开始(一):Web服务

简介: 一、前言 使用Python可以很方便的搭建一个网站,有很多现成的Web框架可以使用例如:Django,Tornado,web.py,web2py,Flask,Bottle等等。我几年前使用Tornado框架为项目做过一个多人协作的管理平台,后来为了想深入学习就自己写了一个简单的Web框架,并在新项目中投入使用已有1年左右,虽然没有上面提到的那些框架那么强大,但也勉强够用。这次刚好有时间做一个简单的记录。

【Python】简单Web框架从零开始(一):Web服务


一、前言


   使用Python可以很方便的搭建一个网站,有很多现成的Web框架可以使用例如:DjangoTornadoweb.pyweb2pyFlaskBottle等等。我几年前使用Tornado框架为项目做过一个多人协作的管理平台,后来为了想深入学习就自己写了一个简单的Web框架,并在新项目中投入使用已有1年左右,虽然没有上面提到的那些框架那么强大,但也勉强够用。这次刚好有时间做一个简单的记录。


二、简单Web服务


   下图展示了我这次要写的Web框架简单示意图,包含有哪些模块,以及它们的调用层级,模板渲染模块会在后面有空的时候再贴进来。


微信截图_20220424002021.png


    浏览器向Web服务器发送请求,这个请求使用TCP协议发送到服务器,因此服务器也需要使用TCP协议才能收到请求,创建一个简单的TCP服务器就像下面代码展示的那样。


tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.bind(("0.0.0.0", 80))
tcp_server.listen(5)
while True:
    client, addr = tcp_server.accept()
    print(u"...接收到连接:", addr)
    while True:
        data = client.recv(1024)
        if not data:
             break
        client.send('hello')
    client.close()
tcp_server.close()


  打开浏览器输入http://127.0.0.1就会看到hello信息。当然作为Web服务器处理请求需要有一定的效率,上面的代码如果同时有多个请求时,只能逐个进行响应,如果采用I/O多路复用以及引入线程池的话,效果会更好一点。下面的代码引入了采用I/O多路复用的select模块,以及将接收数据投递到线程池中进行处理。这样做可以较好的提升Web服务器的处理性能。


class SimpleHttpServer:
    def __init__(self, host, port=80):
        self.http_host = host
        self.http_port = port
        self.http_running = False
        self.http_pool = thread_pool.ThreadExecutor(4)
        self.sock_selector = selectors.DefaultSelector()
        self.http_sock = socket.socket()
    def _setup_server(self):
        self.http_sock.bind((self.http_host, self.http_port))
        self.http_sock.listen(5)
        self.http_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
        ex_data = {"address":(self.http_host, self.http_port), "callback":self._on_new_connected}
        self.sock_selector.register(self.http_sock, selectors.EVENT_READ, ex_data)
        return True        
    def _start_forever(self):
        while self.http_running:
            try:
                events = self.sock_selector.select()
                for obj, mask in events:
                    callback = obj.data["callback"]
                    self.sock_selector.unregister(obj.sock)
                    self.http_pool.submit(callback, obj.sock, obj.data)
            except KeyboardInterrupt as e:
                self.http_running = False
    def _on_new_connected(self, sock, data):
        client, address = sock.accept()
        ex_data = {"address":address, "callback":self._on_client_request}
        self.sock_selector.register(client, selectors.EVENT_READ, ex_data)
        self.sock_selector.register(sock, selectors.EVENT_READ, data)
    def _on_client_request(self, sock, data):
        raw = sock.recv(4096)
        sock.sendall("hello")
        sock.close()
    def start_server(self):
        if not self._setup_server():
            return False
        self.http_running = True
        self._start_forever()
        return True


   我用JMeter创建500用户进行并发测试,Throughput大概可以到400/秒,我使用的还是我的10年前的I3双核笔记本进行测试的,开太多用户反而是JMeter太耗了


微信截图_20220424002133.png


三、后记


   我的开发环境是Python 2.7 64位,如果使用Python3的可以直接使用自带的selectorsThreadExecutor模块,另外这次大概会分两到三期写完。最后我会把代码上传到GitHub上面,如果有兴趣欢迎留信息交流。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关文章
|
10天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
4天前
|
数据库 开发者 Python
Python中使用Flask构建简单Web应用的例子
【4月更文挑战第15天】Flask是一个轻量级的Python Web框架,它允许开发者快速搭建Web应用,同时保持代码的简洁和清晰。下面,我们将通过一个简单的例子来展示如何在Python中使用Flask创建一个基本的Web应用。
|
4天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
6天前
|
关系型数据库 数据库 开发者
Python中的Peewee框架:轻量级ORM的优雅之旅
【4月更文挑战第13天】在Python的众多ORM框架中,Peewee以其轻量级、简洁和易于上手的特点,受到了许多开发者的青睐。Peewee的设计理念是“小而美”,它提供了基本的ORM功能,同时保持了代码的清晰和高效。本文将深入探讨Peewee的核心概念、使用场景以及实战应用,帮助读者更好地理解和使用这一框架。
|
6天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
16天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
17天前
|
数据采集 Java API
python并发编程: Python使用线程池在Web服务中实现加速
python并发编程: Python使用线程池在Web服务中实现加速
17 3
python并发编程: Python使用线程池在Web服务中实现加速
|
JavaScript 前端开发 API
Hello.js – Web 服务授权的 JavaScript SDK
  Hello.js 是一个客户端的 Javascript SDK,用于实现 OAuth2 认证(或者基于 OAuth 代理实现的 OAuth1)的 Web 服务和查询 REST API。 HelloJS 标准化路径和对通用的 API 响应 ,如谷歌的数据服务, Facebook 的图形和 Windows Live 连接。
1044 0
|
15天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
26天前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
26 7

热门文章

最新文章