Python:Python常用开发框架Framework(WEB测试爬虫)总结
Posted SteveRocket
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:Python常用开发框架Framework(WEB测试爬虫)总结相关的知识,希望对你有一定的参考价值。
Python_Framework
介绍
Python开发框架是一组用于简化和加速Python应用程序开发的库和工具。它们提供了一系列预定义的功能和结构,以便开发者能够快速构建、测试和维护应用程序。
总结Python的开发框架,包括:Web框架、爬虫框架、定时任务框架、自动化测试框架、以及其他常用的框架。最新更新,请查看本文GitHub地址
什么是Web Framework?
- Python3 Web框架(Web
framework)开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用。 - Web Application Framework(Web应用程序框架)或简单的Web
Framework(Web框架)表示一个库和模块的集合,它是一套组件,提供通用的设计模式,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等细节。 - 浏览器和服务器的通信是基于HTTP协议进行通信。
Web框架的作用
Web框架是一种软件架构,提供了开发Web应用程序的基础结构和功能,帮助开发人员实现将应用程序部署到Web服务器上的简化。
-
使用 Web 框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。Web 框架使得在进行
网站开发的时候,减少了工作量。使用Web框架进行网站开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。 -
提供模板引擎:模板引擎是将动态显示的数据与html模板结合起来的一种工具。Web框架可以提供多种模板引擎,以方便开发人员选择。
-
处理HTTP请求和响应:Web框架提供HTTP请求和响应的处理机制,包括路由分发、请求参数获取、静态文件处理等。
-
数据库支持:Web框架可以与数据库集成,提供ORM(Object-Relational Mapping)技术,简化数据库操作。
-
用户权限管理:Web框架可以提供用户认证及授权管理功能,确保Web应用程序安全性。
-
开发速度提升:通过提供常用组件和一些便捷的工具,Web框架帮助开发人员提高开发效率,减少开发时间。
Python开发框架
Python Web Framework
WebFramework和优缺点
- Aiohttp
Aiohttp:是一个基于异步的Python 3.5+ Web服务器框架,具有可扩展性,具备快速的响应速度以及更高的并发能力。
- 优点:用于 asyncio 和 Python 的异步 HTTP 客户端 / 服务器。支持客户端和 HTTP 服务器,支持开箱即用的服务器 WebSockets 和客户端 WebSockets,没有回调地狱。Web
服务器具有中间件、信号和可插入路由。 - 缺点:根据 RFC 7231 aiohttp 2.0 版本后做了接受 HEAD 请求的调整,使用之前版本并且用 add_ get () 添加的请求,如果使用 HEAD 方法访问会返回 405。如果处理器会写入很多响应体内容,你可以在执行
HEAD 方法时跳过处理响应体内容以提高执行效率。
- Bottle
是一个轻量级的Web框架,可以在单个文件中创建Web应用程序,具有简单易学的特点。
- 优点:Bottle 是一个用于 Python 的快速、简单和轻量级的 WSGI 微型网络框架。它作为单个文件模块分发,除了 Python 标准库之外没有任何依赖项。支持干净和动态的 URL。快速和 Pythonic 内置模板引擎,支持
mako、jinja2 和 cheetah 模板。方便地访问表单数据、文件上传、cookie、标题和其他与 HTTP 相关的元数据。 - 缺点:Bottle 极简主义的一个后果是有些功能根本就不存在。不支持表单验证,包括 CSRF 保护等功能。如果要构建支持高度用户交互的 Web 应用程序,则需要自己添加它们。
- cyclone
是一个基于Tornado实现的Web框架,设计用于支持大量并发连接和流量,具有高性能、异步I/O和轻量级的特点。
- 优点:Cyclone是Python的Web服务器框架,它将 Tornado API 实现为 Twisted 协议。Twisted 是一个事件驱动的 Python 网络编程框架。它是最成熟的非阻塞 I/O
库之一,可供公众使用。Tornado 是 FriendFeed 网络服务器的开源版本,它是最流行和最快速的 Python
网络服务器之一,具有用于构建网络应用程序的非常不错的API。除了丰富的功能集之外,Cyclone还解决了C10K问题。 - 缺点:Cyclone不再支持 python 2.x。
- Django
GitHub地址: https://github.com/django/django.git
是一个全功能的Web框架,适用于大型Web应用程序开发,具有ORM、模板、表单处理、用户身份验证等内置功能。
- 优点:是一个高层次 Python Web 开发框架,特点是开发快速、代码较少、可扩展性强。Django 采用 MTV(Model、Template、View)模型组织资源,框架功能丰富,模板扩展选择最多。对于专业人员来说,Django
是当之无愧的 Python 排名第一的 Web 开发框架。Django各种内置的功能模块比较完备。大而全,属于重量级框架,集成了很多组件,例如: Models、Admin、Form。 - 缺点:包括一些轻量级应用不需要的功能模块,不如 Flask 轻便。过度封装很多类和方法,直接使用比较简单,但改动起来比较困难。相比于 C,C++ 性能,Djang 性能偏低。模板实现了代码和样式完全分离,不允许模板里出现 Python
代码,灵活度不够。另外学习曲线也相对陡峭。
- Falcon
是一个基于Python的超高性能Web框架,具有异步I/O和轻量级的特点,适用于构建高性能的API和微服务。
- 优点:Falcon 是一个支持大规模微服务 API 或移动 App 后端响应的 Web 开发框架,它完全基于 Python 并提供了非常高的性能、可靠性和可扩展性。Falcon 定位独特且特色鲜明,对于 App
开发者,后端系统构建不妨考虑 Falcon。 - 缺点:Falcon 缺点是其打包模块有点太少,有路由,中间件,钩子,除此之外就不提供其他功能了(裸壳)。额外其他功能,比如验证等都需要开发人员来开发扩展。因为其设计中就假设用于构建 REST API。
- Fastapi
是一个用于构建Web API的现代Web框架,具有快速、易用、高性能和基于标准化的API文档生成等特点。
- 优点:FastAPI 是一个现代、快速(高性能)的Web框架,用于基于标准Python类型提示使用Python 3.6+ 构建API。非常高的性能,与NodeJS和Go相当(感谢 Starlette 和 Pydantic)。可用的最快的
Python框架之一。减少大约40%的人为(开发人员)引发的错误。简短,简单,直观,健壮。 - 缺点:本身不带模板语法,需要安装模板语法
- 优点:Flask 是一个 Python Web 开发的微框架,比较灵活,严格来说,它仅提供 Web 服务器支持,不提供全栈开发支持,原生组件几乎非常少。然而,Flask 非常轻量、非常简单,基于它搭建 Web
系统都以分钟来计时,特别适合小微原型系统的开发。花少时间、产生可用系统,是非常划算的选择。Flask的路由以及路由函数由修饰器设定,开发人员不需要借助其他文件匹配。 - 缺点:对于大型网站开发,需要设计路由映射的规则,否则导致代码混乱。对新手来说,容易使用低质量的代码创建 “不良的 web 应用程序”。
- nameko
是一个Python微服务框架,具有分布式协同、易于扩展、灵活性和内置依赖注入等特点。
- 优点:AMQP RPC 和事件(发布 - 订阅),HTTPGET、POST 和 websockets,CLI 实现简单快速的开发,用于单元和集成测试的实用程序。
- 缺点:nameko 微服务出错不会自动打印错误日志,需要加上监控相关的依赖,计算密集型任务导致任务重试。
- Sanic
是一个异步I/O驱动的Web框架,具有高性能、易用、可扩展性的特点,适用于构建高性能的Web服务。
- 优点:Sanic 是一个 Python 3.7+ web 服务器和 web 框架,它的编写速度很快。它允许使用 Python 3.5 中添加的 async/await
语法,这使您的代码无阻塞且快速。该项目的目标是提供一种简单的方法来启动和运行一个高性能的 HTTP 服务器,该服务器易于构建、扩展和最终扩展。 - 缺点:就功能方面 Sanic 模仿 Flask,比如通过共享 Blueprints 的概念,微小的子应用程序,允许开发人员在更大的应用程序中拆分和组织其代码。对于光光是数据增删改查CRUD应用,Sanic 也不是一个好的选择。
- Tornado
Tornado用户指南
是一个基于异步I/O的Python Web框架和异步网络库,适用于实时Web服务和高并发连接的应用程序。
- 优点:Tornado
是一个基于异步网络功能库的Web开发框架,因此,它能支持几万个开放连接,Web服务高效稳定。可见,Tornado适合高并发场景下的Web系统,开发过程需要采用Tornado提供的框架,灵活性较差,确定场景后再考虑使用不迟。原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架。相比Django是较为原始的框架,诸多内容需要自己去处理。少而精,属于轻量级框架。支持websockets长连接。内嵌了HTTP服务器。单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势。 - 缺点:Tornado 5.0 改进了与 Python 的本机异步功能的集成。因此不再支持 Python 3.3,并且 Python 3.5 用户必须使用 Python 3.5.2 或更高版本。Tornado 6.0 将需要 Python
3.5 及更高版本,并将完全放弃 Python 2 支持。
- Twisted
Twisted是一个基于Reactor模式的异步IO网络框架。基于异步I/O的Python网络框架和协议引擎,适用于开发高性能和可扩展的网络应用程序和服务。
-
优点:
- 强大的异步网络编程能力:Twisted能够高效地处理大量的并发请求,同时保持低延迟和高吞吐量,适用于高并发应用程序。
- 多种协议支持:Twisted支持多种协议,包括TCP、UDP、HTTP、SMTP、IMAP、SSH等等,可以处理各种不同类型的网络请求。
- 可扩展性高:Twisted的组件式设计使它很容易扩展和修改,可以根据实际需求定制不同的应用程序。
- 开源:Twisted是一款开源软件,拥有强大的社区支持和更新,及时修复漏洞和bug。
-
缺点:
- 学习曲线陡峭:由于Twisted的异步编程模型和回调机制,对于初学者来说比较难以理解和使用。
- 调试不易:在Twisted中调试并不是一件容易的事情,因为它的程序执行流程不同于传统的同步编程模型。
- 不适用于所有场景:虽然Twisted适用于高并发的网络应用程序,但它在处理一些CPU密集型任务上性能并不如同步编程模式高效。因此,如果应用程序的任务以计算为主,而不是网络请求的处理,Twisted可能不是最佳选择。
- Webpy
是一个轻量级的Web框架,适用于快速开发小型Web应用程序,具有ORM、模板渲染、HTTP服务器等内置功能。
- 优点:web.py是一个采用Python作为开发语言的Web框架,简单且强大。俄罗斯排名第一的Yandex搜索引擎基于这个框架开发,Guido van Rossum认为这是最好的Python Web框架。
- 缺点:Web.py 并未像其他框架一样保持与 Python 3 兼容性的最新状态。这不仅意味着缺乏对异步语法的支持,还意味着缺少对已弃用的函数的错误。此外,目前尚不清楚维护者是否有计划在 Python 2 到达其支持生命周期结束后保持
Web.py 的最新状态。
- Pyramid
是一个用于开发Web应用程序的通用框架,具有可扩展性、灵活的配置和扩展机制、ORM和安全的身份验证等特点。
- 优点:是一个扩展性很强且灵活的 Python Web 开发框架。上手十分容易,比较适合中等规模且边开发边设计的场景。Pyramid 不提供绝对严格的框架定义,根据需求可以扩展开发,对高阶程序员十分友好。
- 缺点:国内知名度不高,高级用法需要通过阅读源代码获取灵感。默认使用 Chameleon 模板,灵活度没有成为一个要素。
- TurboGears
是一个全功能的Web框架,适用于构建多种类型的Web应用程序,具有ORM、模板、表单处理、安全功能等内置功能。
- 优点:TurboGears 最新版本 试图解决 TurboGears 最初版本、Django、Rails 等框架缺陷,它支持多数据库、javascript 工具集、多种数据交换格式等,当然,它开发非常高效,扩展性很强。试问它与
Django 哪个更好?还真不好说,Django 社区更为活跃或许更重要。 - 缺点:TurboGears 的一些缺点包括管理功能较为基础,较少的第三方应用程序以及只有初级的文档。TurboGears 的一个重大挑战是它的压倒性。因为它混搭的其他组件都提供无限的灵活性,
当试图决定何种路径来完成一个任务时它是过于复杂的。
- CherryPy
是一个轻量级的Web框架,具有WSGI服务器、内置HTTP/HTTPS服务器和一个简单的配置系统等特点,适用于构建小型Web应用程序。
- 优点:CherryPy 能够让开发者按照其他面向对象程序相似的设计方法开发 Web 系统,进而采用最少的代码、最简洁的方式。CherryPy 已经开发了 10 年之久,稳定性较好,非常适合小规模 Web 系统和纯粹的 Python
程序员。感受到了什么?Python 大有一统江湖之势!拭目以待。 - 缺点:只包含为 web 页面提供服务所需的少量内容外,它应该尽可能地让人感觉它不像 “web 框架”,而是像任何其他类型的 Python 应用程序一样。CherryPy 包含的位用作低级构建块。包括会话标识符和 cookie
处理,但不包括 HTML 模板。像 Bottle 一样,CherryPy 提供了一种将路由映射到磁盘上的目录以供静态文件服务的方法。
- Asgineer
是一个用于构建异步Web应用程序的Python框架,具有轻量级和灵活的设计和内置的路由、静态文件处理和WebSocket支持等特点。
-
优点:Asgineer是一种编写异步Web应用程序的工具,使用尽可能少的抽象,同时仍然提供友好的API。只需几分钟即可阅读指南和参考资料!在Uvicorn上运行Asgineer时,它是可用的最快的Web框架之一。它支持http长轮询、服务器端事件(
SSE)和websockets。并且具有以正确(且快速)的方式为资产提供服务的实用程序。 -
缺点:中文文档匮乏。
- Emmett
是一个快速、灵活和可扩展的Web框架,基于Python 3,适用于构建高性能Web应用程序。
- 优点:编写优雅的代码,专注于产品,应该把更多的时间花在产品而不是底层框架上。Emmett是发明家的框架,因为它旨在简化开发过程,其语法简单、易于学习和理解。不要在路由器和不舒服的模式之间浪费时间:每次为应用程序写下路由时,一切都清楚地呈现眼前。
- 缺点:中文文档匮乏。
- apidaora
是一个基于OpenAPI 3规范的Web框架,具有快速开发API的特点,同时提供自动生成API文档和Mock的功能。
- 优点:使用类型注释将请求 / 响应声明为数据类和字典,使用 jsondaora 验证输入数据,最快的python api框架之一,可以在任何asgi服务器上运行。
- 缺点:中文文档匮乏。
- Quixote
是一个轻量级的Web框架,采用基于Python编写Web应用程序的方式,具有内置的模板和安全的性能特点,适用于构建小型Web应用程序。
- 优点:Quixote 是一个使用 Python 编写基于Web的应用程序的框架。它的目标是按此顺序实现灵活性和高性能。Quixote 应用程序的结构往往类似于传统应用程序。格式化网页的逻辑由 Python 类和函数组成。Quixote
不强制分离表示逻辑和 “后端” 逻辑。相反,我们鼓励您使用传统技术。例如,一种解决方案是将表示逻辑放在其自己的子包中。 - 缺点:虽然 Quixote 得到积极维护,但发布频率较低。最近开发的重点是修复错误、提高标准合规性和增加Quixote的灵活性。
- reahl
是一个用于构建Web应用程序的Python框架,具有高扩展性和易于使用的特点,同时提供构建业务逻辑、用户界面和数据库的工具和库。
-
优点:reahl 是一个可以让开发者完全用 Python 语言编写 Web 应用的开放框架,采用 Python 作为唯一开发语言是其最大特色。此外,reahl 提供了相当清晰且简明的开发组建,对于开发一般功能性 Web
系统足够清晰且可行。 -
缺点:提供抽象词汇时,无法掌握一些更高级的用户界面效果,目前不允许使用 Sass 构建 Bootstrap 的修改版本,并支持更高级的用户界面模式
- hug
是一个快速、可扩展和易于使用的Web框架,具有内置的路由、参数类型验证和文档生成等特点,适用于构建高性能Web服务。
- 优点:Hug 是一个Python 3 API开发框架。它的设计使软件工程师可以一次开发API,然后在需要时再使用它。Hug 框架通过提供各种接口来简化 API 开发。这就是为什么该框架被称为 Python 3
中最快的框架之一的主要原因。 - 缺点:它使用以前的 WSGI 标准,这是一个同步框架,所以它不能处理像 WebSockets 和其他异步请求,不管怎么说,它仍然有非常好的性能表现。
- BlackSheep
是一个异步I/O驱动、快速和易于使用的Web框架,具有内置的路由、中间件、异常处理和WebSockets支持等特点。
- 优点:BlackSheep 是一个异步 Web 框架,用于使用 Python 构建基于事件的 Web 应用程序。它的灵感来自 Flask、ASP.NET Core 和 Yury Selivanov 的工作。
- 缺点:中文文档匮乏。
- Index.py
是一个基于Python的Web框架,具有遵循RESTful架构风格、轻量级、易于使用、高性能等特点。
- 优点:实现了 ASGI3 接口并使用 Radix Tree 进行路由查找。是最快的 Python web 框架之一。一切特性都服务于快速开发高性能的 Web 服务。大量正确的类型注释,灵活且高效的路由系统,可视化 API
接口与在线调试,支持 Server-sent events 与 WebSocket,自带一键部署命令 (基于 uvicorn 与 gunicorn),可使用任何可用的 ASGI 生态。 - 缺点:Index.py 不内置数据库、缓存等其他功能。选择困难者请直接使用 Django。
- Starlette
是一个异步I/O驱动、灵活和可扩展的Web框架,具有内置的HTTP服务器、路由和中间件支持等特点。
- 优点:Starlette 是一个轻量级的 ASGI 框架 / 工具包,非常适合构建性能异步服务,它是生产就绪的,并为您提供以下内容:令人印象深刻的表现。WwbSocket 支持。GraphQL
支持。进程内后台任务。启动和关闭事件。基于请求构建的测试客户端。CORS、GZip、静态文件、流响应。会话和 Cookie 支持。100% 的测试覆盖率。100% 类型注释代码库。零硬依赖。 - 缺点:Starlette 提供了所有基本的 Web 微框架功能。但是它不提供自动数据验证,序列化或 API 文档。
- Responder
是一个构建Web API的Python框架,具有内置的路由、请求和响应处理、异常处理等特点,适用于构建高性能和易于使用的API。
- 优点:是 kennethreitz 新开发的一个项目,是一个基于 Python 的 HTTP 服务框架。底层用了 Starlette 的框架,Starlette 是一款轻量级的 ASGI 框架 / 工具包, 可以用 Starlette
构建高性能的异步 IO 服务。相对于 Starlette , responder 对开发者更加友好一点。kennethreitz 写了 requests 号称 “HTTP for Humans”
更加清楚这一点。事实上比较下来,responder 也比 Starlette 优雅很多。 - 缺点:可能是新项目, 打包还不太完善。就目前版本而言,少许代码还不能正常工作。但接口形式已经定义完毕,期待后面版本会加上去。
- Molten
是一个用于构建Web API的轻量级框架,具有装饰器、中间件、请求和响应处理等特点。
- 优点:Molten 是一个最小的、可扩展的、快速的和高效的框架,用于使用 Python 构建 HTTP API。计划自动验证请求,代码更容易维护。实例可自动序列化,包含 API 在现实世界中通常要求的各种功能,广泛使用 PEP484
类型提示和 mypy。 - 缺点:它没有使用像第三方库(如
Pydantic)提供数据验证,序列化和文档,它有自己的库。因此,这些数据类型定义将不太容易重用。依赖注入系统需要对依赖项进行预注册,并且将基于已声明的类型解决依赖问题。因此,不可能声明多个组件来提供一个特定的类型。
- Clastic
是一个轻量级的Python Web框架,适用于构建小型Web应用程序,具有路由、模板渲染、类型转换等内置功能。
- 优点:一个功能强大的 Python Web 框架,可简化显式开发实践,同时消除全局状态。Clastic 是完全用 Python 语言编写的,增强可重用性和可测试性,主动 URL
路由检查,更好地控制应用程序初始化,改进的中间件范例,没有全局状态,ORM 用法,更容易的 WSGI 集成。 - 缺点:Clastic 没有构建全局状态;URL 路由规则参数和视图函数签名不匹配,在 Clastic 中,这种不匹配会在构建应用程序时引发异常。
- Masonite
是一个用于构建Web应用程序的Python框架,具有路由、模板、ORM、用户身份验证等内置功能,同时提供可扩展的插件和扩展。
- 优点:现代和以开发人员为中心的 Python Web 框架致力于实现实际的 batteries,包括具有许多开箱即用功能的开发人员工具,具有极其可扩展的架构。Masonite 非常适合初学者开发人员进入他们的第一个 Web
应用程序,以及需要充分利用 Masonite 的全部潜力来完成他们的应用程序的经验丰富的开发人员。Masonite 努力实现从安装到部署的快速简便,因此开发人员可以尽可能快速有效地从概念到创建。 - 缺点:对于 Masonite 来说,最大的”竞争对手”是Django, 因为社区正在竭尽全力将框架推向容易,令人愉悦的下一件大事。与 Django 相比,Masonite 仍然是婴儿,期待它未来的表现。
-
是一个基于ASGI标准的Web框架,具有异步I/O和高性能,适用于构建高性能Web服务。
- 优点:Quart 是一个 Python 网络微框架。使用 Quart,您可以呈现和提供 HTML 模板,编写(RESTful)JSON API,服务 WebSockets,流请求和响应数据,几乎可以通过 HTTP 或 WebSocket
协议做任何事情。 - 缺点:它仅支持 Python 3.7+。
- Tonberry
是一个使用asyncio构建的面向对象Web框架,具有路由、模板渲染、ORM和中间件支持等特点。
- 优点:一个符合 ASGI 的 Web 微框架,采用基于类的路由方法。受 CherryPy 的影响但与 asyncio 兼容。一个名为 Qactuar 的配套 ASGI 服务器是从这个目前正在进行的项目中产生的。
- 缺点:在使用拉取请求,请使用自动格式化程序 iSort 和 Black 并使用 MyPy 验证代码。这是在不消除某些类型错误的情况下,并不总是可以使 MyPy 完全满意,但是至少尽你所能并谨慎使用注释
# type: ignore
。最后,尝试,尽可能提供最准确的类型提示。
- Klein
是一个轻量级的Web框架,具有路由、模板渲染、异步I/O等特点,适用于构建小型Web应用程序。
- 优点:Klein 是一个微框架,用于使用 Python 开发可用于生产的 Web 服务。它是 “微” 的,因为它具有类似于 Bottle 和 Flask 的非常小的 API。它不是
“微”,因为它依赖于标准库之外的东西。这主要是因为它建立在广泛使用和经过良好测试的组件上,如 Werkzeug 和 Twisted。 - 缺点:也许有点过时了。
- CubicWeb
是一个语意Web开发框架,适用于构建复杂的Web应用程序,具有ORM、DCES、RQL、安全性等特点。
- 优点:CubicWeb 是一种语义 Web 应用程序框架,在 LGPL 下获得许可,它使开发人员能够通过重用组件(称为立方体)并遵循众所周知的面向对象设计原则来有效地构建 Web
应用程序。满足常见需求的可重用组件(数据模型和视图)库,Python 编程语言的强大功能和灵活性,用于存储后端的 SQL 数据库、LDAP 目录、Subversion 和 Mercurial 的可靠性。 - 缺点:要在 CubicWeb 应用程序中获取或操作持久数据,可以使用关系查询语言(RQL),RQL 提供了一种高度分离的路径来相互关联各种数据源。但是,随着它的实现,通过手动构建查询作为字符串,它可能会让习惯于 ORM
的开发人员感到过时。使用 CubicWeb 还有其他障碍。首先,设置可能很麻烦。另一个潜在的问题是缺少本机模板引擎;生成 HTML 留给开发人员。CubicWeb 支持 Python 3,但 Twisted 等模块本身并未完全移植。
- Zope2
是一个Web框架和应用程序服务器,适用于构建企业级Web应用程序,具有灵活性、可扩展性、内置安全功能等特点。
- 优点:Zope 2 是一款基于 Python 的 Web 应用框架,是所有 Python Web 应用程序、工具的鼻祖,是 Python 家族一个强有力的分支。Zope 2 的 “对象发布”
系统非常适合面向对象开发方法,并且可以减轻开发者的学习曲线,还可以帮助你发现应用程序里一些不好的功能。 - 缺点:Zope 不适用于简单的 RESTful API(每 Bottle 或 Flask),甚至不适用于具有交互性的基本网站(à la Django),由于 Zope
的尺寸和复杂性,安装需要一些工作;这不是简单地将源解压缩到项目子文件夹中的问题。
- Web2py
是一个全功能的Web框架,适用于开发快速且安全的Web应用程序,具有ORM、插件、安全性等内置功能。
- 优点:Web2py 是一个用 Python 语言编写的免费的开源 Web 框架,旨在敏捷快速的开发 Web 应用,具有快速、可扩展、安全以及可移植的数据库驱动的应用,遵循 LGPLv3 开源协议。Web2py
提供一站式的解决方案,整个开发过程都可以在浏览器上进行,提供了 Web 版的在线开发,HTML 模版编写,静态文件的上传,数据库的编写的功能。其它的还有日志功能,以及一个自动化的 admin 接口。 - 缺点:Web2py 的一个重要限制是它仅与 Python 2.x 兼容。首先,这意味着 Web2py 无法使用 Python 3 的异步语法。如果你依赖于 Python 3 独有的外部库,那么你就不走运了。但是,正在开展使 Web2py
Python 3 兼容的工作,并且在撰写本文时它已接近完成
- Pylons
是一个灵活的Web框架,具有自定义路由、自定义模板渲染、常规Web框架功能等特点。
- 优点:Pylons 是一个开放源代码的 Web 应用框架,使用 python 语言编写。它对 WSGI 标准进行了扩展应用,提升了重用性且将功能分割到独立的模块中。Pylons 是最新的 Web 应用框架中的典型,类似于 Django
和 TurboGears。Pylons 受 Ruby on Rails 影响很深:它的两个组件,Routes 和 WebHelpers 是 Rails 特性的 Python 实现。 - 缺点:Pylons 已与 repoze.bfg 合并,现在处于仅维护模式。强烈建议新项目从新合并的 Web 框架金字塔开始。
- Cubes
是一个用于构建OLAPcubes的Python框架,具有OLAP和数据挖掘技术的特点。
- 优点:Cubes 是一个轻量级的 Python 框架和工具集,用于开发报告和分析应用程序、在线分析处理 (OLAP)、多维分析和浏览聚合数据。它是 Data Brewery 的一部分。
- 缺点:不再为每个多维数据集提供隐式聚合 record_count。它必须明确定义为聚合:旧的后端架构是有限制的。它只允许使用一个商店,必须在服务器启动之前知道模型,不可能从远程来源获取模型。
- Dpark
是一个分布式计算框架,基于Apache Spark,具有高扩展性、容错性和高性能。
- 优点:DPark 是 Spark 的 Python 克隆版本,是一个 Python 实现的分布式计算框架,可以非常方便地实现大规模数据处理和低延时的迭代计算。该计算框架类似于 MapReduce,但是比其更灵活,可以用 Python
非常方便地进行分布式计算,并且提供了更多的功能,以便更好地进行迭代式计算。DPark 由国内的豆瓣公司开发实现和负责维护,据豆瓣公司的描述,目前豆瓣公司内部的绝大多数数据分析都使用 DPark 完成,整个项目也正趋于完善。 - 缺点:Dpark 使用的是进程,在 Python 中,由于 GIL (Global Interpreter Lock) 的存在,即使在多核机器上使用多个线程,这些线程之间也没有办法真正地实现并发执行。
- Buildbot
是一个持续集成工具,用于构建、测试和部署软件,具有可配置性、灵活性、多平台支持等特点。
- 优点:Buildbot 是 python 实现的开源持续构建和持续交付工具,为 Python, Mozilla, Chromium, WebKit 等知名项目使用。Buildbot 可以直接使用 python
包,轻松拥有上万库,具备强大的扩展能力。如果你觉得 Jenkins 已经轻松地满足你的需求,你不需要 Buildbot。如果你在使用 Jenkins 时觉得效率低下、扩展困难、一些用 python 等脚本可以实现的动作在 Jenkins
困难重重,那么可以看看 Buildbot。 - 缺点:buildbot 对多项目支持并不好。
爬虫框架
-
是Python的一个开源网络爬虫框架,用于抓取互联网上的数据,提取结构性数据而编写的应用框架。
-
PySpider
是Python的一个开源功能强大的网络爬虫框架,可轻松编写爬取逻辑,支持分布式爬取,同时提供了web界面管理工具。能在浏览器界面上进行脚本的编写。 -
- 是Python的一个开源高效爬虫框架,提供了编写爬虫逻辑的API,支持多线程与分布式爬取。
- 支持关系和非关系数据库,数据可以导出为JSON、XML等。
-
Portia
是Scrapy的一个可视化爬虫工具,通过简单地拖拽和点击,即可完成HTML页面模板和数据解析规则的创建,不需要任何编程知识。 -
Beautiful Soup
是Python的一个开源库,用于解析HTML/XML等结构化的文本数据,广泛应用于Web爬虫和数据抓取应用中。 -
Requests
是Python的一个HTTP库,用于向Web服务器发送HTTP请求并获取响应。 -
Selenium
是Python的一个开源自动化测试工具,可用于模拟用户在浏览器上的操作并生成脚本,如点击、输入等,同时支持多种浏览器。 -
PyQuery
是Python的一个解析HTML/XML的库,提供了类似jQuery的语法,可快速定位、解析和操作HTML/XML文档,并从中提取数据。 -
Pyspide
是Python的一个分布式网络爬虫框架,使用WebSocket进行通信,支持JavaScript渲染页面,同时提供web界面管理工具。 -
urllib
是Python的一个标准库,包含了发送HTTP请求、处理HTTP响应等功能。
用于在Web浏览器和服务器之间共享数据。 -
MechanicalSoup
是Python的一个库,用于模拟网页的交互操作,自动提交表单、点击按钮等。
自动化Web浏览器和交互式Web程序。它构建在Beautiful Soup之上,提供了自动填充表单和点击按钮等功能。 -
lxml
是Python的一个开源库,可用于解析HTML/XML等结构化的文本数据,性能较Beautiful Soup更快,支持XPath表达式。
它可以解析大量数据,并支持XPath和CSS选择器来查找和提取数据。 -
Grab
是Python的一个开源网络爬虫框架,提供了类似jQuery的语法,支持多线程和分布式爬取,同时支持cookie、代理等功能。
,可以支持HTTP和FTP协议,提供了强大的过滤和解析功能。
定时任务框架
- Celery
Celery是一个异步任务队列和调度程序,可用于执行定时任务和长时间运行的任务。它支持多种任务类型和调度器类型,易于扩展。
- airflow
是一个开源的平台,它提供了一种轻松创建、调度和监控复杂数据管道(data
pipelines)的方法。它可以将不同的数据源、计算引擎和工具集成到一个有组织的工作流中,使数据在不同的系统之间流动。Airflow包括一个灵活的调度器,可以根据依赖关系安排任务的执行顺序,并自动重新运行失败的任务。在数据工程领域,Airflow已成为一种重要的工具,用于处理大量的数据处理和ETL任务。
-
APScheduler
APScheduler是一个轻量级的Python库,用于在特定的时间执行任务。它支持多种触发器和调度器类型,可以精确地控制任务的执行。 -
Schedule
Schedule是一个Python库,提供了一种简单的方式来安排和执行定期运行的任务。它可以使用类似cron的语法定义任务,支持多种任务类型。 -
CronTab
CronTab是一个Python库,用于读取和操作Unix系统的crontab文件。它支持创建、删除和更新定期运行的任务,可用于管理系统级别的定时任务。 -
Timeloop
Timeloop是一个轻量级的Python库,用于执行重复性的任务。它可以使用装饰器或上下文管理器来定义任务,支持秒级、分级和小时级的任务。 -
Huey
Huey是一个轻量级的Python库,用于执行异步和延迟任务。它可以与Redis或MongoDB等后端存储一起使用,并提供了可扩展的任务调度和队列管理。
自动化测试框架
参考:自动化测试框架
其他框架
- pyscript
是一个用于 CPython 的脚本扩展库,它允许开发者以 Python 调用或编写 C/C++ 扩展模块。它提供了一个简单的 API,允许将 Python 对象和函数导出到 C/C++,以便于从 C/C++ 代码中进行调用。
pyscript 使得使用 C/C++ 实现高性能计算的 Python 应用程序变得更加容易,同时支持各种平台和编译器。
python3开发进阶-Django框架的ORM常用字段和参数
阅读目录
一、常用字段
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。 (最大十位)
CharField
字符类型,必须提供max_length参数, max_length表示字符长度。
DateField
日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
二、字段合集
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, \'both\',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
三、自定义字段
class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return \'integer UNSIGNED\'
自定义char类型字段:
class FixedCharField(models.Field): """ 自定义的char类型的字段类 """ def __init__(self, max_length, *args, **kwargs): self.max_length = max_length super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为max_length指定的值 """ return \'char(%s)\' % self.max_length class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用自定义的char类型的字段 cname = FixedCharField(max_length=25)
创建的表结构:
附ORM字段与数据库实际字段的对应关系
对应关系: \'AutoField\': \'integer AUTO_INCREMENT\', \'BigAutoField\': \'bigint AUTO_INCREMENT\', \'BinaryField\': \'longblob\', \'BooleanField\': \'bool\', \'CharField\': \'varchar(%(max_length)s)\', \'CommaSeparatedIntegerField\': \'varchar(%(max_length)s)\', \'DateField\': \'date\', \'DateTimeField\': \'datetime\', \'DecimalField\': \'numeric(%(max_digits)s, %(decimal_places)s)\', \'DurationField\': \'bigint\', \'FileField\': \'varchar(%(max_length)s)\', \'FilePathField\': \'varchar(%(max_length)s)\', \'FloatField\': \'double precision\', \'IntegerField\': \'integer\', \'BigIntegerField\': \'bigint\', \'IPAddressField\': \'char(15)\', \'GenericIPAddressField\': \'char(39)\', \'NullBooleanField\': \'bool\', \'OneToOneField\': \'integer\', \'PositiveIntegerField\': \'integer UNSIGNED\', \'PositiveSmallIntegerField\': \'smallint UNSIGNED\', \'SlugField\': \'varchar(%(max_length)s)\', \'SmallIntegerField\': \'smallint\', \'TextField\': \'longtext\', \'TimeField\': \'time\', \'UUIDField\': \'char(32)\',
四、字段参数
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
DateField和DateTimeField
auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
注意:上面auto_now_add和auto_now不能同时出现在在一个地方。
五、关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 \'一对多\'中\'多\'的一方。
ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
related_name
反向操作时,使用的字段名,用于代替原反向查询时的\'表名_set\'。
例如:
class Classes(models.Model): name = models.CharField(max_length=32) class Student(models.Model): name = models.CharField(max_length=32) theclass = models.ForeignKey(to="Classes")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().student_set.all()
当我们在ForeignKey字段中添加了参数 related_name 后,
class Student(models.Model): name = models.CharField(max_length=32) theclass = models.ForeignKey(to="Classes", related_name="students")
当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:
models.Classes.objects.first().students.all()
related_query_name
反向查询操作时,使用的连接前缀,用于替换表名。
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
models.DO_NOTHING
删除关联数据,引发错误IntegrityError
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
def func(): return 10 class MyModel(models.Model): user = models.ForeignKey( to="User", to_field="id", on_delete=models.SET(func) )
db_constraint
是否在数据库中创建外键约束,默认为True。
OneToOneField
一对一字段。
通常一对一字段用来扩展已有字段。
示例
一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。
class Author(models.Model): name = models.CharField(max_length=32) info = models.OneToOneField(to=\'AuthorInfo\') class AuthorInfo(models.Model): phone = models.CharField(max_length=11) email = models.EmailField()
字段参数
to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
同ForeignKey字段。
ManyToManyField
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。
字段参数
to
设置要关联的表
related_name
同ForeignKey字段。
related_query_name
同ForeignKey字段。
symmetrical
仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
class Person(models.Model): name = models.CharField(max_length=16) friends = models.ManyToManyField("self")
此时,person对象就没有person_set属性。
class Person(models.Model): name = models.CharField(max_length=16) friends = models.ManyToManyField("self", symmetrical=False)
此时,person对象现在就可以使用person_set属性进行反向查询。
through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
through_fields
设置关联的字段。
db_table
默认创建第三张表时,数据库中表的名称。
六、多对多关联关系的三种方式
方式一:自行创建第三张表
class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") # 自己创建第三张表,分别通过外键关联书和作者 class Author2Book(models.Model): author = models.ForeignKey(to="Author") book = models.ForeignKey(to="Book") class Meta: unique_together = ("author", "book")
方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") # 通过ORM自带的ManyToManyField自动创建第三张表 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") books = models.ManyToManyField(to="Book", related_name="authors")
方式三:设置ManyTomanyField并指定自行创建的第三张表
class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") # 自己创建第三张表,并通过ManyToManyField指定关联 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book")) # through_fields接受一个2元组(\'field1\',\'field2\'): # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。 class Author2Book(models.Model): author = models.ForeignKey(to="Author") book = models.ForeignKey(to="Book") class Meta: unique_together = ("author", "book")
注意:
当我们需要在第三张关系表中存储额外的字段时,就要使用第三种方式。
但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系。
元信息
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
db_table
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。
index_together
联合索引。
unique_together
联合唯一索引。
ordering
指定默认按什么字段排序。
只有设置了该属性,我们查询到的结果才可以被reverse()。
以上是关于Python:Python常用开发框架Framework(WEB测试爬虫)总结的主要内容,如果未能解决你的问题,请参考以下文章