python bottle api_Python的8大成熟Web框架概要简介(一)

本文由牛旦课堂原创编译

编译者:墨子老师

参考链接:

https://www.infoworld.com/article/3586120/8-great-little-python-web-frameworks.html

1. 前言

Python的便利性和多功能性意味着它几乎被用于构建各行各业的软件。一个主要的利基是web服务,Python的开发速度和灵活性使其可以很容易地快速建立和运行网站。

正如您可能猜到的那样,Python在web框架中为您提供了大量的选择和自由度,无论大小。毕竟,不是每个web项目都需要是企业级的。大多数应该能足够完成工作就可以了,而不是追逐更大。本文将分两部分介绍8个最知名的Python框架,它们强调简单性、轻量级交付,接下来就具体点地了解下这些框架。

9fdc78eef11497803178a2536871885e.png

2. Bottle

Bottle(http://bottlepy.org/)可以被认为是一种迷型Flask,因为它甚至比其他的“微框架”更紧凑和简洁。由于Bottle占用的空间很小(最小化封装),所以它非常适合包含在其他项目中,或者用于快速交付像REST APIs这样的小项目。(后面会讨论Flask。)

9c0edd9f8db4074875bd9973c4e4bfa1.png

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/')def index(name):    return template('Hello {{name}}!', 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年,但并没有失去它从一开始就与众不同的极简主义和优雅。

6e654d6c569e70d4efd554118ad22b76.png

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。

87f27d68208a7ef5a4d5f89e33ba73ea.png

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端点而服务,且运行速度也很快。

e91b67f410b89605d48435b5fe4b2e31.png

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连发:点赞、转发和关注。谢谢啦^_^

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值