使用put方法上传文件_一篇文章整合基于Flask应用Graphql上传文件的方法

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##软件开发#

dd6c4f27e0c20ea14fb0c33dfa8b99a9.png
f28c510bdc0320280e241615a784023c.png
80844ba8098162e4ecb9b667a6d42a28.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值