tartiflette,一个有趣的 Python 库!

news2024/11/17 23:34:01

0bb2f480f3dae63efa8d810781ebb7e8.png

更多Python学习内容:ipengtao.com

大家好,今天为大家分享一个有趣的 Python 库 - tartiflette。

Github地址:https://github.com/tartiflette/tartiflette


Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程库如asyncio之上,提供了高性能的GraphQL执行环境。Tartiflette专注于提供最佳的开发者体验,支持最新的GraphQL特性。

安装

安装Tartiflette相对简单,但需要依赖于一些系统级的库。

首先,需要确保系统中已安装了libgraphqlparser,然后通过pip安装Tartiflette:

pip install tartiflette

特性

  • 完全支持GraphQL规范:支持所有GraphQL操作,包括查询、变更和订阅。

  • 异步支持:内建支持异步数据解析,允许高效处理数据。

  • 易于集成:可以轻松集成到现有的Python异步应用程序中。

  • 强大的错误处理:提供详细的错误信息,帮助开发者快速定位问题。

基本功能

创建GraphQL Schema

使用Tartiflette,你可以通过定义SDL(Schema Definition Language)来创建GraphQL schema:

from tartiflette import Engine

sdl = """
type Query {
    hello(name: String): String
}
"""

def resolve_hello(parent, args, context, info):
    name = args.get('name', "world")
    return f"Hello, {name}!"

engine = Engine(sdl, resolvers={"Query.hello": resolve_hello})

这段代码定义了一个简单的schema,其中包含一个hello查询,它接受一个名称并返回一个问候语。

执行GraphQL查询

一旦定义了schema和解析器,你就可以执行GraphQL查询了:

import asyncio

async def main():
    query = 'query { hello(name: "Tartiflette") }'
    result = await engine.execute(query)
    print(result)

asyncio.run(main())

这将输出:{'data': {'hello': 'Hello, Tartiflette!'}}

高级功能

Tartiflette提供了多种高级功能,使得GraphQL服务器能够处理更复杂的业务逻辑和数据流。

自定义中间件

Tartiflette允许开发者实现自定义中间件,这些中间件可以在解析操作前后执行,非常适合用于权限检查、日志记录等任务。

class AuthorizationMiddleware:
    async def on_query_execution(
        self, executor, query, variables, operation_name, context
    ):
        # 检查用户权限
        if not context.get('user').is_admin:
            raise Exception("Unauthorized")
        return await executor(query, variables, operation_name, context)

# 在创建Engine时添加中间件
engine = Engine(sdl, middlewares=[AuthorizationMiddleware()])

这个中间件检查用户是否具有管理员权限,如果没有则抛出异常。

自定义标量类型

Tartiflette支持自定义标量类型,允许开发者扩展GraphQL的类型系统,例如添加日期时间类型或JSON类型。

from tartiflette import Scalar

@Scalar("DateTime")
class ScalarDateTime:
    @staticmethod
    def coerce_output(value):
        return value.isoformat()

    @staticmethod
    def coerce_input(value):
        return dateutil.parser.parse(value)

sdl = """
scalar DateTime

type Query {
    currentTime: DateTime
}
"""

def resolve_current_time(parent, args, ctx, info):
    return datetime.datetime.now()

engine = Engine(sdl, resolvers={"Query.currentTime": resolve_current_time})

这个例子中创建了一个DateTime标量类型,用于处理日期时间格式的数据。

异步数据加载和批处理

在处理大量数据请求时,Tartiflette支持异步数据加载和批处理,减少数据库访问次数,优化性能。

from tartiflette import Resolver

@Resolver("Query.users")
async def resolve_users(parent, args, ctx, info):
    user_ids = args.get("userIds")
    return await ctx.user_loader.load_many(user_ids)

# 假设 user_loader 是一个使用 DataLoader 进行批处理的加载器

这段代码通过DataLoader批量加载用户数据,减少了对数据库的查询次数,提高了查询效率。

订阅和实时更新

Tartiflette支持GraphQL订阅,使得客户端可以订阅数据的实时更新。

from tartiflette import Subscription

@Subscription("Subscription.onMessageAdded")
async def on_message_added_subscription(parent, args, ctx, info):
    async for message in ctx.message_queue:
        yield message

sdl = """
type Subscription {
    onMessageAdded(channelId: ID!): Message
}

type Message {
    id: ID!
    text: String!
}
"""

# message_queue 是一个异步队列,新消息会被推送到这个队列中

这段代码允许客户端订阅特定频道的消息,当新消息到达时,系统会自动推送给订阅者。

实际应用场景

Tartiflette的设计和功能使其非常适用于多种实际应用,从复杂的后端服务到数据密集型应用,再到实时通信平台。

构建企业级后端服务

Tartiflette非常适合构建需要处理大量复杂查询和数据集成的企业级后端服务。

from tartiflette import Engine

sdl = """
type Query {
    employee(id: ID!): Employee
}

type Employee {
    id: ID
    name: String
    position: String
    department: Department
}

type Department {
    id: ID
    name: String
}
"""

async def resolve_employee(parent, args, ctx, info):
    # 假设有一个函数从数据库获取员工信息
    return await ctx.data_loader.get_employee_by_id(args['id'])

engine = Engine(sdl, resolvers={"Query.employee": resolve_employee})

在这个例子中,GraphQL API 允许客户端查询特定员工的详细信息,包括他们的部门信息。这样的服务可以提供给内部系统使用,或集成到企业的人力资源管理系统中。

实时数据处理与订阅

Tartiflette支持订阅,使得开发实时数据处理和通信应用成为可能,如实时消息应用或实时数据仪表板。

from tartiflette import Subscription

@Subscription("Subscription.newPrice")
async def subscription_new_price(parent, args, ctx, info):
    async for price in ctx.price_update_generator:
        yield {"newPrice": price}

sdl = """
type Subscription {
    newPrice(stockId: ID!): PriceUpdate
}

type PriceUpdate {
    stockId: ID!
    newPrice: Float!
}
"""

# 假设 price_update_generator 是一个异步生成器,推送股票价格更新

在这个场景中,客户端可以订阅特定股票的价格更新,每当价格有变动时,更新就会实时推送给订阅者。

多源数据集成与GraphQL封装

在涉及多个数据源和遗留系统的复杂环境中,Tartiflette可以帮助统一数据访问接口,简化前端开发。

from tartiflette import Engine

sdl = """
type Query {
    productInfo(productId: ID!): Product
}

type Product {
    id: ID
    name: String
    price: Float
    supplier: Supplier
}

type Supplier {
    id: ID
    name: String
    rating: Float
}
"""

async def resolve_product(parent, args, ctx, info):
    # 同时从不同系统获取产品和供应商数据
    product = await ctx.products_api.get_product(args['productId'])
    supplier = await ctx.suppliers_api.get_supplier(product['supplierId'])
    product['supplier'] = supplier
    return product

engine = Engine(sdl, resolvers={"Query.productInfo": resolve_product})

这个示例演示了如何整合产品信息和供应商信息,为前端提供一致且简单的数据访问点,避免直接与复杂的后端系统交互。

总结

Python的Tartiflette库是一个高性能的GraphQL服务器实现,专为现代异步Python应用设计。它完全支持GraphQL规范,提供了强大的功能,如异步数据解析、订阅支持、自定义指令和中间件等,使其成为构建复杂和高效Web服务的理想选择。Tartiflette的设计注重开发者体验,支持快速集成到现有的Python系统中,无论是数据密集型应用、企业级后端服务还是实时数据处理和通信平台,Tartiflette都能提供一致的、优化的解决方案。通过其简洁的API和灵活的配置选项,Tartiflette让GraphQL服务的开发变得更加简单和高效。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

cb68ffeafdb474090f3b5d0a1c0ae0d5.gif

我们还为大家准备了Python资料和副业项目合集,感兴趣的小伙伴快来找我领取一起交流学习哦!

38f8df36f28a487d00b4599d3296efee.jpeg

往期推荐

历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)

Python基础学习常见的100个问题.pdf(附答案)

学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)

Python办公自动化完全指南(免费PDF)

Python Web 开发常见的100个问题.PDF

肝了一周,整理了Python 从0到1学习路线(附思维导图和PDF下载)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习中线性回归算法的推导过程

线性回归是机器学习中监督学习中最基础也是最常用的一种算法。 背景:当我们拿到一堆数据。这堆数据里有参数,有标签。我们将这些数据在坐标系中标出。我们会考虑这些数据是否具有线性关系。简单来说 我们是否可以使用一条线或者一个平面去拟合这些数据的…

Android Compose 二:布局的对齐方式

布局的对齐方式 使用Modifier 内容或者子组件居中 Text(text "Hello $name!",modifier Modifier.fillMaxSize() //设置宽高撑满.wrapContentHeight(align Alignment.CenterVertically) //设置竖直居中.wrapContentWidth(align Alignment.CenterHorizontally…

相亲系统功能介绍

相亲系统是一种旨在帮助单身人士寻找合适伴侣的平台,其主要功能通常包括以下几个方面: 实名认证:为了确保双方的权益保障,用户必须进行实名认证后才能使用该系统。这有助于增加系统的安全性和可信度。偏好选择:用户可…

数据结构(十一)----图的应用

目录 一.最小生成树 1.Prim算法(普里姆) 2.Kruskal算法(克鲁斯卡尔): 二.最短路径(BFS算法) 1.单源最短路径 (1)BFS算法(无权图) (2)Dijkstra算法&…

带你入门React

目录 前言一,基本配置1.1 环境搭建1.2 页面初始化渲染二,基础学习2.1 结构与样式开发2.2 数据展示2.3 行内样式2.4 条件渲染2.5 列表渲染2.6 点击事件 三,页面更新3.1 组件数据3.2 组件数据共享 总结 前言 笔者之前的工作经验都局限于Vue&am…

CCF-Csp算法能力认证,202209-1如此编码(C++)含解析

前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码:6vdq”复制这段内容后打开手机迅雷…

YOLOv8独家原创改进: 通用倒瓶颈(UIB)搜索块结合C2f二次创新 | 轻量化之王MobileNetV4

💡💡💡创新点:轻量化之王MobileNetV4 开源 | Top-1 精度 87%,手机推理速度 3.8ms,原地起飞! 最主要创新:引入了通用倒瓶颈(UIB)搜索块,这是一个统一且灵活的结构,它融合了倒瓶颈(IB)、ConvNext、前馈网络(FFN)以及一种新颖的额外深度可分(ExtraDW)变体技…

【大学物理】双语笔记

7.5 angular momentu(角动量)_哔哩哔哩_bilibili 6.4Energy in Rotation Motion 有质量有速度的物体有动能,是不是很有道理 international system(from French systeme international,acronym,SI)of ineria kg*m^2 转…

使用Nuxt.js实现服务端渲染(SSR)

Nuxt.js 是一个基于 Vue.js 的框架,它提供了服务器端渲染(SSR)和静态站点生成(SSG)的能力,使开发者能够轻松地构建高效、优雅的前端应用。Nuxt.js 集成了许多开箱即用的功能和工具,帮助开发者快…

AI换脸原理(4)——人脸对齐(关键点检测)参考文献2DFAN:代码解析

注意,本文属于人脸关键点检测步骤的论文,虽然也在人脸对齐的范畴下。 1、介绍 在本文中,重点介绍了以下几项创新性的成果,旨在为人脸关键点检测领域带来新的突破。 首先,成功构建了一个卓越的2D人脸关键点检测基线模型。这一模型不仅集成了目前最优的关键点检测网络结构,…

动态代理,案例理解

动态代理:代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,动态代理就是用来对业务功能(方法)进行代理的。 步骤: 1.必须有接口,实现类要实现接口&#xf…

前端开发攻略---使用Sass调整颜色亮度,实现Element组件库同款按钮

目录 1、演示 2、实现原理 3、实现代码 1、演示 2、实现原理 改变颜色亮度的原理是通过调整颜色的 RGB 值中的亮度部分来实现的。在 Sass 中,可以使用颜色函数来操作颜色的 RGB 值,从而实现亮度的调整。 具体来说,亮度调整函数通常会改变颜…

win11个性化锁屏界面怎么关闭?

win11个性化锁屏界面关闭方法对于win11用户来说,关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作,分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步,点击底部Windows图…

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏,Qt基于系统的原生接口封装有一些非常见类,如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等,用于利用工具栏提供更多的信息,诸如…

Vue3 +Element-Plus Select 下拉菜单样式修改

需求 <el-selectv-model"sizeLang"placeholder"Select"style"width:116px"popper-class"selectBk"><el-optionv-for"item in langueOptions":key"item.value":label"item.label":value"i…

【刷题】前缀和进阶

送给大家一句话&#xff1a; 生活坏到一定程度就会好起来&#xff0c;因为它无法更坏。努力过后&#xff0c;才知道许多事情&#xff0c;坚持坚持&#xff0c;就过来了。 – 宫崎骏 《龙猫》 ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ┌(˘⌣˘)ʃ ┌(˘…

三、VGA接口驱动与图像显示动态移动

文章目录 一、参数介绍二、彩条显示2.1 模块系统架构框图2.2 行、场同步波形:2.3 代码三、VGA 图像显示动态移动3.1波形设计3.2代码 一、参数介绍 对于普通的 VGA 显示器&#xff0c;共有 5 个信号&#xff1a;R、G、B 三基色&#xff1b;HS&#xff08;行同步信号&#xff09…

更专业的汽车软件研发工具链,怿星重磅发布新产品

怿星科技在2024北京国际车展同期举办主题为“创新引领未来——聚焦智能汽车软件新基建”的新产品发布会&#xff0c;重磅推出1款绝对优势产品和4套场景解决方案。同时举行了4场热点技术研讨&#xff1a;国产工具链的机遇与挑战、新架构下的的车载DDS应用探索及测试方案介绍、软…

Vue3 查看真实请求地址

上回说到Vue2查看真实请求地址&#xff0c;那么Vue3该如何查看呢&#xff1f; 传送门&#xff1a; Vue2 查看真实请求地址 1. bypass函数 使用bypass函数获取代理结果&#xff0c;设置响应头&#xff08;请求头设置未生效&#xff0c;也可以在响应头上看&#xff09;。 2. …

JVM认识之垃圾收集算法

一、标记-清除算法 1、定义 标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象&#xff08;即垃圾&#xff09;&#xff0c;在标记完成后再统一回收所有垃圾对象。 2、优点和缺点 优点&#xff1a;实现简单缺点&#xff1a; 可能…