【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上面,如果有兴趣欢迎留信息交流。


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

相关文章
|
3月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
121 61
|
3月前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
1天前
|
数据采集 Web App开发 存储
打造高效的Web Scraper:Python与Selenium的完美结合
本文介绍如何使用Python结合Selenium,通过代理IP、设置Cookie和User-Agent抓取BOSS直聘的招聘信息,包括公司名称、岗位、要求和薪资。这些数据可用于行业趋势、人才需求、企业动态及区域经济分析,为求职者、企业和分析师提供宝贵信息。文中详细说明了环境准备、代理配置、登录操作及数据抓取步骤,并提醒注意反爬虫机制和验证码处理等问题。
打造高效的Web Scraper:Python与Selenium的完美结合
|
13天前
|
数据采集 Web App开发 API
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
本文介绍了如何使用FastAPI和Selenium搭建RESTful接口,访问免版权图片网站Pixabay并采集图片及其描述信息。通过配置代理IP、User-Agent和Cookie,提高爬虫的稳定性和防封禁能力。环境依赖包括FastAPI、Uvicorn和Selenium等库。代码示例展示了完整的实现过程,涵盖代理设置、浏览器模拟及数据提取,并提供了详细的中文注释。适用于需要高效、稳定的Web数据抓取服务的开发者。
55 15
FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
|
8天前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
40 7
|
1月前
|
JSON 安全 中间件
Python Web 框架 FastAPI
FastAPI 是一个现代的 Python Web 框架,专为快速构建 API 和在线应用而设计。它凭借速度、简单性和开发人员友好的特性迅速走红。FastAPI 支持自动文档生成、类型提示、数据验证、异步操作和依赖注入等功能,极大提升了开发效率并减少了错误。安装简单,使用 pip 安装 FastAPI 和 uvicorn 即可开始开发。其优点包括高性能、自动数据验证和身份验证支持,但也存在学习曲线和社区资源相对较少的缺点。
84 15
|
3月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
159 62
|
3月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
118 61
|
3月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
66 2
|
3月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
110 1

热门文章

最新文章

  • 1
    打造高效的Web Scraper:Python与Selenium的完美结合
    13
  • 2
    Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
    26
  • 3
    AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
    20
  • 4
    【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
    54
  • 5
    部署使用 CHAT-NEXT-WEB 基于 Deepseek
    342
  • 6
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 7
    java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
    40
  • 8
    零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
    28
  • 9
    【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
    22
  • 10
    FastAPI与Selenium:打造高效的Web数据抓取服务 —— 采集Pixabay中的图片及相关信息
    55
  • 推荐镜像

    更多