Graphql 定义
GraphQL 是 API 的查询语言,是用于现有的数据来完成查询。
GraphQL 为 API 中的数据提供了完整且易于理解的描述,使客户能够准确地请求他们所需的内容。
文章背景
一个开发项目要求基于 Flask 应用 GraphQL API 进行开发,但是在开发过程中发现,部分请求涉及到上传文件等操作,但是众所周知 GraphQL 对 文件上传的支持非常的不好,且没有比较好用的官方包,在经过研究废了九牛二虎之力后,终于验证获得了一个可行的办法,因为知识点太过零碎,所以在这整理出来与诸位分享,希望可以帮助有需要的人!
项目所需模块
Flask==1.0.2Flask-GraphQL==2.0rc0graphene==2.1.2graphene-file-uploadaiogqlcasyncio
模块安装方法
# Flaskpip install Flask# graphenepip install graphene# graphene_file_uploadpip install graphene-file-upload# aiogqlcpip install aiogqlc# asynciopip install asyncio
完整服务端代码逻辑
from flask import Flaskimport graphenefrom graphene_file_upload.scalars import Uploadfrom graphene_file_upload.flask import FileUploadGraphQLView################################################### Define the schema##################################################class Query(graphene.ObjectType): ok = graphene.Boolean(default_value=True)class MyUpload(graphene.Mutation): class Arguments: file_in = Upload() ok = graphene.Boolean() def mutate(self, info, file_in): for line in file_in: print(line) return MyUpload(ok=True)class Mutation(graphene.ObjectType): my_upload = MyUpload.Field()schema = graphene.Schema(query=Query, mutation=Mutation)################################################### Define the app##################################################app = Flask(__name__)app.add_url_rule( '/graphqlapi', view_func=FileUploadGraphQLView.as_view( 'graphql', graphiql=True, schema=schema, ))
客户端代码逻辑及问题
根据找到的相关资料显示,客户端的请求方法案例仅仅给出了一个应用 curl 的方法,但是就实际使用而言,怎么能让客户使用 curl 来请求 API 接口呢,估计会被老板打死的,之后经过研究查询找到了找到的应用 aiogqlc 来替代 curl 发起请求的办法。
curl请求方法
curl http://localhost:5000/graphqlapi -F operations='{"query": "mutation ($file: Upload) { myUpload(fileIn: $file) { ok }}", "variables": { "file": null }}' -F map='{ "0": ["variables.file"]}' -F 0=@xxxxx文件
应用 aiogqlc请求方法
from aiogqlc import GraphQLClientimport asynciomutation = ''' mutation($files: Upload) { myUpload(fileIn: $files) { ok } }'''variables = { 'files': [ open(r'C:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.csv', 'rb'), ], 'data':None}async def foo(): client = GraphQLClient('http://127.0.0.1:5000/graphqlapi') response = await client.execute(mutation, variables=variables) print(await response.json())if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(foo())
结语
上面代码示例仅仅是一个test case,如果诸位在应用时有什么问题没办法解决,欢迎留言交流!!!
#科技新星创作营##python##软件开发#