在尝试使用Python进行GraphQL开发时遇到的问题
我之前使用RESTFul API进行了各种实现,但是开始担心API散布在各种服务器上和查询次数等问题,于是决定采用GraphQL来解决这些问题。
在学习过程中遇到了很多不懂的地方,所以打算记下我遇到的困难点。
使用Python的GraphQL
我认为在Python中,可以使用的库基本上只有Graphene。除此之外,我没有特别在寻找其他的库。
由于我们公司使用的DBMS是SQLServer,所以选择了SQLAlchemy作为ORM。考虑到不需要过重的框架,我们选择了Flask作为我们的Web框架。
步骤一:环境准备
基本环境
-
- MacOS Sierra 10.12.6
-
- Homebrew 1.5.11
-
- virtualenv 15.1.0
- Python 3.6.1
需求清单
aniso8601==3.0.0
click==6.7
Flask==0.12.2
Flask-GraphQL==1.4.1
graphene==2.1
graphene-sqlalchemy==2.0.0
graphql-core==2.0
graphql-relay==0.4.5
inflect==0.2.5
iso8601==0.1.12
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
promise==2.1
pyodbc==4.0.23
Rx==1.6.1
singledispatch==3.4.0.3
six==1.11.0
sqlacodegen==1.1.6
SQLAlchemy==1.2.6
typing==3.6.4
Werkzeug==0.14.1
第二步。教程。
按照教程进行操作,虽然能够完成动作,但会遇到一些不明白的问题。
“Connection是指什么?”
在初始教程中,涉及到了“edge”和“node”这两个关键词。看起来它们是由Graphene的Connection对象生成的。
石墨烯连接
在石墨烯中,连接(Connection)被写作是对列表进行扩展,并提供切片和分页功能。
一开始我对此没有概念,费了不少劲,但通过阅读下文的文章,我大致理解了。
GraphQL入门 – 引人入胜的GraphQL GraphQL服务器规范
总结起来,GraphQL的Connection似乎提供了重新获取对象的机制。对于可能频繁添加或数据量较大的数据,使用Connection而非List似乎更合适。
步骤3. 要将Connection用作实用工具
虽然Connection为我们设置了分页机制,这真是太好了,但是当我希望更详细地创建筛选器时,我感觉graphene提供的功能还不够充分。
如果列出主要想做的事情的话
-
- 値による比較(完全一致、範囲、文字列パターン、など)
- 順序の指定
关于这一点,似乎只能继承并扩展Graphene的连接。在StackOverflow上,有很多关于如何设置查询并进行扩展、如何定义FilterQuery对象等的回答。如何进行筛选和限制?
有些代码可以以公开Alchemy模型的方式进行筛选,但这样做可能并不理想哈哈。似乎需要创建一个可以根据连接定义的机制。
顺便提一句,如果用Django来做的话,似乎可以使用一个叫做Django-filter的库来实现大部分需求。
至于在SQLAlchemy中如何实现最佳方式,我并不很清楚,看来需要发明或发现一种方法。请问有人能告诉我一个好的方法吗?
步骤4. 关于变量的定义
在Graphene中,您可以自由地编写类似方法的查询。
请你帮我开门。(Can you help me open the door?)
请你给我打电话。(Can you call me?)
请你把这个盒子拿给我。(Can you bring me this box?)
query {
getUser(name: "Hoge") {
user {
id
name
}
}
}
我在寻找一种好的设计方法,这样就可以通过在Graphene中添加需要查询的字段来实现。目前我觉得Github的API是最好的选择。
步骤5. 关于突变处理
这个机制很简单。我认为在一定程度上需要内部的设计是无可避免的。
第六步骤:会话权限。
在处理会话和权限方面,最好是由Flask等上层框架来处理,如果可能的话,最好根据账户权限来区分入口点。
在我的情况下,由于各种原因,我决定按照以下的结构来安排。
graphql-application
|
--- schema
|
--- admin-schema
|
--- model
|
app.py
总结
一开始,我打算宣传说「用GraphQL来构建API很简单!」,但是在尝试过后,我发现「这个真的挺麻烦的」,感觉有很多困难。
除非先对GraphQL本身有一定的了解,否则会很辛苦。
我得去学习一下……
草案
GraphQL学习会数据