当前位置: 首页 > news >正文

构建高效PythonWeb:GraphQL+Sanic

1.1 简介:在当今快速发展的技术时代,Web应用的性能和灵活性变得越来越重要。在众多技术中,GraphQL和Sanic以其独特的优势脱颖而出。GraphQL,作为一个强大的数据查询语言,为前端和后端之间的通信提供了极大的灵活性。而Sanic,则是一个快速的异步Web框架,专为快速HTTP响应设计。本文将探索如何将GraphQL与Sanic结合使用,以创建高效、灵活的Python Web应用。

2.1 历史攻略:

gin框架:安装使用、restful增删改查

sanic:view - restful普通和异步的写法

API-restful规范

3.1 GraphQL:GraphQL是由Facebook开发的一种数据查询和操作语言,主要用于API。与传统的REST API相比,GraphQL的主要优点在于其灵活性和效率。它允许客户端准确指定所需的数据,避免了过度获取或欠缺获取数据的问题。此外,GraphQL支持实时数据更新,非常适合需要实时功能的现代应用。

3.2 GraphQL的核心特性:

精准的数据获取:客户端可以请求所需的确切数据,无需额外负载。

单一终点:所有数据请求都通过单一API终点处理,简化了数据交互流程。

类型系统:GraphQL拥有强类型系统,使得数据模型更加清晰和健壮。

4.1 安装依赖:注意要相应版本,太新的可能不兼容。

pip install sanic == 20.12.0
pip install graphene == 2.1.9
pip install graphene sanic-graphql == 1.1.0

4.2 案例源码:

# -*- coding: utf-8 -*-
# time: 2024/01/05 09:54
# file: graphql_demo.py
# 公众号: 玩转测试开发import graphene
from sanic import Sanic
from sanic_graphql import GraphQLView# 定义一个人物信息的GraphQL类型
class Person(graphene.ObjectType):name = graphene.String()age = graphene.Int()address = graphene.String()class Query(graphene.ObjectType):hello = graphene.String()fruit = graphene.List(graphene.String)  # 定义为字符串列表person_info = graphene.Field(Person)  # 使用Person类型def resolve_hello(self, info):return "World"def resolve_fruit(self, info):return ["apple", "orange"]  # 返回一个字符串列表def resolve_person_info(self, info):# 返回一个Person实例return Person(name="Tom", age=30, address="UK")app = Sanic("GraphQLApp")app.add_route(GraphQLView.as_view(schema=graphene.Schema(query=Query),graphiql=True),'/graphql',methods=['GET', 'POST']  # 允许 GET 和 POST 请求
)if __name__ == '__main__':app.run()

4.3 后端运行:

图片

5.1 客户端访问:http://127.0.0.1:8000/graphql

5.2 单个查询:

{hello
}

5.3 单个查询的返回结果:

{"data": {"hello": "World"}
}

图片

5.4 多个查询:

{hellofruitpersonInfo {nameageaddress}
}

5.5 多个查询的返回结果:

{"data": {"hello": "World","fruit": ["apple","orange"],"personInfo": {"name": "Tom","age": 30,"address": "UK"}}
}

图片

6.1 结合使用GraphQL和Sanic,可以为开发者提供以下优势:

高效的数据处理:GraphQL提供精确数据获取,减少不必要的网络负担。

快速响应时间:Sanic的异步处理能力确保了即使在高负载下能快速响应。

灵活性和可扩展性:GraphQL的灵活查询机制加上Sanic的简洁性,使得应用易于扩展和维护。

7.1 对比:GraphQL和RESTful API是两种流行的Web服务架构风格,它们各有优劣,适用于不同的应用场景。下面是它们之间的一些关键对比:

7.2 GraphQL优势

灵活的数据查询:GraphQL允许客户端指定所需的确切数据,减少了数据的过度获取和不必要的网络开销。

单一终点:所有的操作通过单一的API端点进行,简化了复杂应用的数据管理。

实时数据:支持通过订阅实时更新数据,非常适合需要实时功能的应用。

类型系统:内置强类型系统,有利于API的自我文档化,提高了开发效率和代码的可维护性。

7.3 GraphQL劣势

缓存复杂性:由于每个查询可能都是独特的,标准的HTTP缓存机制不如在REST中那么有效。

查询复杂性:复杂的查询可能导致性能问题,如深度嵌套查询可能对服务器造成压力。

学习曲线:对于新手来说,GraphQL的概念、类型系统和查询语言需要一定时间去学习和适应。

8.1 RESTful API优势

标准化:作为成熟的架构风格,REST具有广泛的支持和社区知识库。

简单的缓存策略:利用HTTP协议的缓存机制,可以轻松实现API响应的缓存。

易于理解和实现:RESTful API的概念直观,易于理解和实现,适用于大多数标准Web应用。

无状态性:每个请求都是独立的,这简化了服务器的设计和扩展。

8.2 RESTful API劣势

过度获取/欠获取数据:客户端可能需要从多个端点获取数据,这可能导致过度获取或欠获取数据。

多个请求:构建复杂界面时,可能需要向多个不同的API端点发送请求,增加了网络延迟。

版本管理:随着API的发展,版本管理可能变得复杂,需要维护不同版本的API。

9.1 综合考虑

应用场景:对于需要高度灵活性和定制化数据请求的应用,GraphQL是更好的选择。而对于简单、标准化的数据交换需求,RESTful可能更合适。

性能考量:如果应用依赖于有效的网络缓存来提高性能,REST可能是更好的选择。对于需要实时数据更新和复杂数据模型的应用,GraphQL可能更适合。

团队熟悉度:考虑团队对这两种技术的熟悉程度也是非常重要的,一个熟悉REST的团队可能更快地实现和维护RESTful API。

最终的选择应该基于特定项目的需求、团队的专长和未来的可扩展性。在某些情况下,结合使用GraphQL和RESTful API,利用两者的优势,也是一种可行的策略。

10. 结论:GraphQL和Sanic的结合为Python Web应用开发带来了前所未有的灵活性和效率。无论是构建小型应用还是大型企业级应用,这种组合都是一个非常有吸引力的选择。随着技术的不断进步,我们期待看到更多创新的应用案例诞生。

相关文章:

构建高效PythonWeb:GraphQL+Sanic

1.1 简介:在当今快速发展的技术时代,Web应用的性能和灵活性变得越来越重要。在众多技术中,GraphQL和Sanic以其独特的优势脱颖而出。GraphQL,作为一个强大的数据查询语言,为前端和后端之间的通信提供了极大的灵活性。而…...

【通义千问】大模型Qwen GitHub开源工程学习笔记(5)-- 模型的微调【全参数微调】【LoRA方法】【Q-LoRA方法】

摘要: 训练数据的准备 你需要将所有样本放到一个列表中并存入json文件中。每个样本对应一个字典,包含id和conversation,其中后者为一个列表。示例如下所示: [{"id": "identity_0","conversations": [{"from": "user",…...

PCL 大地坐标转空间直角坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 二、代码实现 头文件及读取保存函数见:PCL 空间直角坐标转大地坐标(直接求解法C…...

Linux之Shell编程

shell是什么 shell是一个命令行解释器,他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至编写一些程序。 shell脚本的执行方式 脚本格式要求 脚本以#!/bin/bash开头脚本需…...

Unity组件开发--传送点

本组件仅实现A传送点到B传送的功能,是可以双向传送的,如果只要单向传送,可以另外改脚本实现; 先看效果: unity组件传送点演示 1.传送组件shader是怎么写的:这种效果的实现方案 shader编辑器是这样的&#…...

vue结合Cesium加载gltf模型

Cesium支持什么格式? Cesium支持的格式包括:3D模型格式(如COLLADA、gITF、OBJ)、影像格式(如JPEG、PNG、GeoTIFF)、地形格式(如STL、Heightmap)、矢量数据格式(如GeoJSON…...

逆置算法和数组循环移动算法

元素逆置 概述:其实就是将 第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依次到中间位置。用途:可用于数组的移动,字符串反转,链表反转操作,栈和队列反转等操作。 逆置图解 …...

【MATLAB】数豆子

Matlab数豆子 创建一个变量来表示豆子的数量。例如,可以使用豆子数量 100;来表示有100颗豆子。 使用disp函数打印出豆子的数量。例如,可以使用disp([目前有 num2str(豆子数量) 颗豆子])来打印出当前豆子的数量。 进行豆子的计数操作。例如&#xff0c…...

QT C++中调用python脚本时,import第三方库失败问题解决

QT C中调用python脚本时,import第三方库失败问题解决 文章目录 QT C中调用python脚本时,import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言 项目需要&#xff0c…...

【AI视野·今日Robot 机器人论文速览 第七十期】Thu, 4 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 4 Jan 2024 Totally 17 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Many-Objective-Optimized Semi-Automated Robotic Disassembly Sequences Authors Takuya Kiyokawa, Kensuke Harada, Weiwei …...

Flutter中的布局组件介绍及使用

1. 引言 Flutter 是一款由 Google 开发的开源 UI 软件开发工具,可用于在单个代码库中构建漂亮、本机编译的应用程序。在 Flutter 中,布局是构建用户界面的核心部分之一。本文将介绍 Flutter 中的全部布局组件,以及它们的使用方式。 2. 基础…...

【面试高频算法解析】算法练习2 回溯(Backtracking)

前言 本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态 专栏导航 二分查找回溯(Backtracking&…...

认识Git

🌎初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…...

@RequestParam,@RequestBody和@PathVariable 区别

RequestParam,RequestBody和PathVariable 这三者是spring常见的接受前端数据的注解,那么他们分别是接受什么的前端数据呢? RequestParam:这个注解主要用于处理请求参数,尤其是GET请求中的查询参数和表单参数。它可以用…...

vue3组件传参

1、props: 2、自定义事件子传父 3、mitt任意组件通讯 4、v-model通讯(v-model绑定在组件上) (1)V2中父子组件的v-model通信,限制了popos接收的属性名必须为value和emit触发的事件名必须为input,所以有时会有冲突; 父组件: 子组件: (2)V3中:限制了popos接收的属性名…...

React16源码: React中创建更新的方式及ReactDOM.render的源码实现

React当中创建更新的主要方式 ReactDOM.render || hydrate 这两个API都是我们要把整个应用第一次进行渲染到我们的页面上面能够展现出来我们整个应用的样子的一个过程这是初次渲染 setState 后续更新应用 forceUpdate 后续更新应用 replaceState 在后续被舍弃 关于 ReactDOM…...

CentOS 7 系列默认的网卡接口名称

CentOS 7 系列默认的网卡接口是随机的,如果要修改网卡名称以 eth 开头,有两种方式。 方法一:安装系统时 在安装界面移动光标到 Install Centos 7.按 TAB 键 在出现的代码的末尾添加:net.ifnames0 biosdevname0.按下回车开始安装即…...

多文件上传

HTML中实现多文件上传是通过用<input type"file">元素的multiple属性&#xff0c;以下简单描述多文件上传的步骤 HTML表单准备&#xff0c;使用<input type"file">元素&#xff0c;并为其添加multiple属性&#xff0c;以允许用户选择多个文件…...

2024.1.7力扣每日一题——赎金信

2024.1.7 题目来源我的题解方法一 哈希表方法二 数组 题目来源 力扣每日一题&#xff1b;题序&#xff1a;383 我的题解 方法一 哈希表 使用哈希表记录ransomNote中所需字符的数量&#xff0c;然后遍历magazine并将哈希表中存在的对应的数量减一 时间复杂度&#xff1a;O(nm…...

C#中List<T>底层原理剖析

C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count&#xff1a;3.List的底层原理3.1. 构造3.2 Add()接口3.3 Remove()接口3.4 Inster()接口3.5 Clear()接口3.6 Contains()接口3.7 ToArray()接口3.8 Find()接口3.8 Sort()接口 4. 总结5. 参考 1. 基础用法 list.Max() …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...