构建高效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(豆子数量) 颗豆子])来打印出当前豆子的数量。 进行豆子的计数操作。例如,…...
QT C++中调用python脚本时,import第三方库失败问题解决
QT C中调用python脚本时,import第三方库失败问题解决 文章目录 QT C中调用python脚本时,import第三方库失败问题解决前言一、问题复现二、调试过程三、问题解决1 numpy问题解决2 matplotlib问题解决 四、补充说明五、参考资料 前言 项目需要,…...
【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属性,以下简单描述多文件上传的步骤 HTML表单准备,使用<input type"file">元素,并为其添加multiple属性,以允许用户选择多个文件…...
2024.1.7力扣每日一题——赎金信
2024.1.7 题目来源我的题解方法一 哈希表方法二 数组 题目来源 力扣每日一题;题序:383 我的题解 方法一 哈希表 使用哈希表记录ransomNote中所需字符的数量,然后遍历magazine并将哈希表中存在的对应的数量减一 时间复杂度:O(nm…...
C#中List<T>底层原理剖析
C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count: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() …...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
Vue3学习(接口,泛型,自定义类型,v-for,props)
一,前言 继续学习 二,TS接口泛型自定义类型 1.接口 TypeScript 接口(Interface)是一种定义对象形状的强大工具,它可以描述对象必须包含的属性、方法和它们的类型。接口不会被编译成 JavaScript 代码,仅…...
