构建高效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() …...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
