百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python的8大成熟Web框架概要简介(一)

ccwgpt 2024-09-20 13:23 40 浏览 0 评论

本文由牛旦课堂原创编译

编译者:墨子老师

参考链接:

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


相关推荐

十分钟让你学会LNMP架构负载均衡(impala负载均衡)

业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...

AGV仓储机器人调度系统架构(agv物流机器人)

系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...

远程热部署在美团的落地实践(远程热点是什么意思)

Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...

springboot搭建xxl-job(分布式任务调度系统)

一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...

大模型:使用vLLM和Ray分布式部署推理应用

一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...

国产开源之光【分布式工作流调度系统】:DolphinScheduler

DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...

简单可靠高效的分布式任务队列系统

#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...

虚拟服务器之间如何分布式运行?(虚拟服务器部署)

  在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...

一文掌握 XXL-Job 的 6 大核心组件

XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...

京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?

京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...

企业级项目组件选型(一)分布式任务调度平台

官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

SpringBoot整合ElasticJob实现分布式任务调度

介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...

分布式可视化 DAG 任务调度系统 Taier 的整体流程分析

Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...

SpringBoot任务调度:@Scheduled与TaskExecutor全面解析

一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...

取消回复欢迎 发表评论: