Python的8大成熟Web框架概要简介(一)
bigegpt 2024-10-21 03:49 2 浏览
本文由牛旦课堂原创编译
编译者:墨子老师
参考链接:
https://www.infoworld.com/article/3586120/8-great-little-python-web-frameworks.html
1. 前言
Python的便利性和多功能性意味着它几乎被用于构建各行各业的软件。一个主要的利基是web服务,Python的开发速度和灵活性使其可以很容易地快速建立和运行网站。
正如您可能猜到的那样,Python在web框架中为您提供了大量的选择和自由度,无论大小。毕竟,不是每个web项目都需要是企业级的。大多数应该能足够完成工作就可以了,而不是追逐更大。本文将分两部分介绍8个最知名的Python框架,它们强调简单性、轻量级交付,接下来就具体点地了解下这些框架。
2. Bottle
Bottle(http://bottlepy.org/)可以被认为是一种迷型Flask,因为它甚至比其他的“微框架”更紧凑和简洁。由于Bottle占用的空间很小(最小化封装),所以它非常适合包含在其他项目中,或者用于快速交付像REST APIs这样的小项目。(后面会讨论Flask。)
Bottle的整个代码库都可以放在一个文件中,并且完全没有外部依赖关系。即便如此,Bottle还是配备了足够的功能来构建常见的web应用程序,而不需要依赖外界的帮助。
Bottle中的路由系统将url映射到函数,其语法与Flask几乎完全相同。应用中你也不会被局限于一组硬连接的路径,而是可以动态地创建它们。请求和响应数据、cookie、查询变量、POST操作的表单数据、HTTP报头和文件上传都可以通过Bottle的对象访问和操作。
每一项能力的实现都很注意细节。例如,对于文件上传,如果文件的命名约定与目标文件系统冲突(例如在Windows中文件名中的斜杠),则不必重命名文件。Bottle可以帮你做到这一点。
Bottle包含有它自己的简单HTML模板引擎。同样,尽管模板引擎很小,但它具有所有的基本功能。模板中包含的变量默认使用安全HTML渲染;同时你必须指出,哪些变量是安全的,以便按照字面意思重新生成。如果您愿将Bottle的模板引擎换为另一个模板引擎,比如Jinja2,那么Bottle可以让您轻松地这样做。我更喜欢与Bottle捆绑的简单模板系统;它速度快,语法朴实无华,并且允许您在不太困难的情况下混合代码和模板文本。
Bottle甚至支持多个服务器后端。它自带了用于快速测试的内置迷你服务器(内置了开发服务器),而且还支持通用的WSGI、各种与WSGI兼容的HTTP服务器,如果需要,也可支持普通的旧式CGI。比如,在Bottle中的“Hello World”程序:
from bottle import route, run, template
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080)
运行此脚本或将其粘贴到Python控制台,然后将浏览器指向http://localhost:8080/hello/world。就这样实现了编程中“经典”。
与其他框架相比,Bottle不需要那么多的文档,但是它的文档也绝不少。所有的关键内容都适用于单页面(虽然很长的)。除此之外,您还可以找到每个API的完整文档、在各种基础设施上部署的示例、对内置模板语言的解释和大量常用方法。
与Flask一样,您可以手动或通过插件扩展Bottle的功能。Bottle插件远没有Flask插件那么多,但是拥有着一些有用的部分,如与各种数据库层的集成和基本的用户身份验证。对于异步支持,Bottle可用现有的异步运行的服务器适配器,比如aiohttp/uvloop,但是sync/await不是原生支持。
Bottle的极简设计的一个后果就是有些东西根本就不存在。表单验证,包括CSRF(cross-site request forgery,跨站点请求伪造)保护特性没有包括在内。如果您想构建一个支持高度用户交互的web应用程序,您需要自己添加这种支持。
Bottle的另一个问题是发展已经迟滞很久了,最新版本是0.12,最开始是在2013年发布的,后又小版本更新(最新稳定版是2019年12月发布的0.12.18,开发中的0.13版还没正式发布)。也就是说,Bottle将继续被维护,并且它的开发版本仍然可以用于生产。开发人员打算交付新的版本,以摆脱对Python的遗留版本的支持。
关于Bottle下载与安装
使用pip install bottle安装最新的稳定版本,或者将bottle.py(不稳定)下载到您的项目目录中。除了Python标准库之外,Bottle没有硬依赖项。Bottle支持Python 2.7和Python 3。
注意,自0.13版本开始不推荐在Python 2.5和2.6下使用Bottle,此版本去掉了对它们的支持。
概要总结一下:Bottle是一个快速和简单的微型框架,用于小型web应用程序。它提供了url参数支持、模板、内置HTTP服务器和许多用于第三方WSGI/HTTP- Server和模板引擎的适配器服务于请求分派(路由)——所有这些都在一个文件中,除了Python标准库之外没有其他依赖关系。
2. CherryPy
CherryPy(http://www.cherrypy.org/)已经以这样或那样的形式存在了将近20年,但并没有失去它从一开始就与众不同的极简主义和优雅。
CherryPy背后的目标,除了只包含服务web页面所需要的少量内容之外,是尽可能让人感觉不像“web框架”,而是像任何其他类型的Python应用程序。像Hulu和Netflix这样的网站已经在生产中使用了CherryPy,因为这个框架提供了一个非常包容的构建基础。CherryPy在底层使用线程池,更好地支持多线程服务器适配器。
CherryPy可以让您的web应用程序远离核心逻辑。要将应用程序的函数映射到CherryPy提供的url或路由,需要创建一个类,其中对象的名称空间直接映射到需要提供服务的url。例如,网站的根目录由一个名为“index”的函数提供。传递给这些函数的参数用于相应的处理GET或POST方法提供的变量。
CherryPy包含的比特意味着作为低级构建块工作。包含了Session标识符和cookie处理,但没有包含HTML模板。与Bottle一样,CherryPy提供了一种将路由映射到磁盘目录的方法,用于静态文件服务。
CherryPy通常会遵从现有的第三方库来支持某个特性,而不是本地化(原生)提供它。例如,WebSocket应用程序不是由CherryPy直接支持的,而是通过ws4py库支持的。
CherryPy的文档包含一个方便的教程,介绍了该程序的各个方面。与其他一些框架教程不同,它不会带您了解完整的端到端应用程序,但仍然很有用。文档中有关于虚拟主机部署、通过Apache和Nginx进行反向代理以及许多其他场景的便签笔记式说明。
应用示例代码如下:
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
3. Falcon
如果您正在构建基于REST的APIs,那么Falcon(http://falconframework.org/)就是专门为您设计的。精悍、快速,除了标准库之外几乎没有依赖,Falcon提供了REST api所需的一切,仅此而已。2019年发布的Falcon2.0废除了对Python 2.x支持,并且至少需要Python 3.5。
Falcon获得“轻薄”(light & slender)标签的很大一部分原因与框架中的代码行数无关。这是因为Falcon几乎没有将自己的结构强加给应用程序。Falcon应用程序所要做的就是指出哪些函数映射到哪些API端点。从端点返回的JSON只涉及设置路由以及经由Python标准库json.dumps函数返回的数据。对异步的支持还没有在Falcon中实现,但是正在努力在Falcon 3.0中实现。
Falcon还采用了健全的开箱即用的默认设置,所以安装时不需要什么修改。例如,对于没有显式声明的任何路由,默认情况下都会引发404s。如果希望向客户机返回错误,可以抛出与框架捆绑在一起的大量常规异常(如HTTPBadRequest)中的一个,或者使用通用的falcon.HTTPError异常。如果需要对路由进行预处理或后处理,Falcon也为它们提供了钩子。
Falcon对APIs的关注意味着这里很少有使用传统HTML用户界面构建web应用程序的内容。例如,不要对表单处理函数和CSRF保护工具抱有太多期望。但是,Falcon提供了优雅的选项来扩展其功能,因此可以构建更复杂的项目。除了上述钩子机制之外,您还可以找到一个用于创建中间件的接口,该接口可用于包装所有Falcon的APIs。
与其他框架相比,Falcon的文档比较少,但这只是因为覆盖的内容比较少。用户指南包括对所有主要特性的正式的逐步演示,以及快速启动部分,允许您查看有或没有注释的样例代码。
示例代码如下:
class QuoteResource:
def on_get(self, req, resp):
"""Handles GET requests"""
quote = {
'quote': (
"I've always been more interested in "
"the future than in the past."
),
'author': 'Grace Hopper'
}
resp.media = quote
api = falcon.API()
api.add_route('/quote', QuoteResource())
4. FastAPI
FastAPI(https://fastapi.tiangolo.com/)的名称很好地总结了它所做的事情。它被构建为快速创建API端点而服务,且运行速度也很快。
FastAPI利用Starlette项目作为其高速网络核心,但是要使用FastAPI,您不需要了解Starlette的内部原理。定义端点的方式与Flask或Bottle应用程序非常相似——使用装饰器(decorator)来指明哪个函数处理哪个路由——然后返回自动转换成JSON的字典。
您可以很容易地重写返回内容的方式。例如,如果希望从某些端点返回HTML/XML,只需返回一个自定义响应对象即可。如果您想要添加自定义中间件,您可以弹出任何遵循ASGI标准的内容。
FastAPI使用Python的类型提示来提供路由所接受的数据类型的约束。例如,如果您有一个类型为Optional[int]的路由,FastAPI将拒绝除整数以外的所有提交。你不需要添加数据校验代码到你的端点,可以只使用类型提示,然后让FastAPI来完成这项工作。
当然,有些东西被省略了。例如,没有原生HTML模板引擎,但并不缺少填补这一空白的第三方解决方案。数据库连接也是如此,但是文档中包含了关于如何协同某些ORMs(例如Peewee)使用FastAPI的异步行为而工作的细节。
示例代码如下:
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
5.小结
本文主要主要介绍了Python8大web框架的第一部分,详细情况,有兴趣的读者可以按照提供的官方链接进一步去了解。每个框架各有优劣,可酌情根据需要来进行取舍采用。另一部分简介下一次再发布分享,敬请关注。
另外,请顺手搞个3连发:点赞、转发和关注。谢谢啦^_^
相关推荐
- Docker篇(二):Docker实战,命令解析
-
大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...
- docker学习笔记——安装和基本操作
-
今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...
- 不可错过的Docker完整笔记(dockerhib)
-
简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...
- 扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!
-
其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...
- 第五节 Docker 入门实践:从 Hello World 到容器操作
-
一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...
- 替代Docker build的Buildah简单介绍
-
Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...
- Docker 命令大全(docker命令大全记录表)
-
容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...
- docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)
-
一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...
- 使用Docker快速部署Storm环境(docker部署confluence)
-
Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...
- Docker Desktop安装使用指南:零基础教程
-
在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...
- Linux如何成功地离线安装docker(linux离线安装httpd)
-
系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...
- Docker 类面试题(常见问题)(docker面试题目)
-
Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...
- 面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?
-
最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...
- 【Docker 新手入门指南】第五章:Hello Word
-
适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...
- 松勤软件测试:详解Docker,如何用portainer管理Docker容器
-
镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...
- 一周热门
- 最近发表
-
- Docker篇(二):Docker实战,命令解析
- docker学习笔记——安装和基本操作
- 不可错过的Docker完整笔记(dockerhib)
- 扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!
- 第五节 Docker 入门实践:从 Hello World 到容器操作
- 替代Docker build的Buildah简单介绍
- Docker 命令大全(docker命令大全记录表)
- docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)
- 使用Docker快速部署Storm环境(docker部署confluence)
- Docker Desktop安装使用指南:零基础教程
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)