web框架
gql-ext的Python项目详细描述
GraphQL立面
graphqlfaccade是一个python应用程序中介,它在 在后端使用GraphQL和REST应用程序的前端应用程序 服务描述的面向声明样式。在
GraphQL门面允许
- 使用GraphQL语言向REST服务发出请求
- 使用批量加载(以规则为准)
向应用程序添加新的REST服务
要添加新服务,您需要执行以下几个步骤:
- 在graphql syntax中创建数据架构的描述
- 创建REST service description(支持yaml或json)
- {json(或yaml}描述)
- 将schema description添加到主配置文件
- 在应用程序设置中指定服务的基Url
休息服务说明
<service_name>:
<endpoint_name>:
method: <METHOD>
path: <PATH>
service_name
:restapi服务的名称。endpoint_name
:您的REST端点的名称。method
:GET、POST、PATCH、PUT、DELETE(获取默认值)path
:到yor端点的路径
分解器
^{pr2}$Parent_name.field_name
:graphql模式中的字段名(例如Query.name
)endpoint
:此数据字段的rest端点为service_name
。endpoint_name
格式loader
:自定义解析程序的路径(不是必需字段)。使用python站点包语法args
:如果您想使用任何参数来请求REST,可以设置args字段。
param_name
-变量的任意名称,param_value
-任意值。
要使用父元素的属性,请使用parent.
前缀,然后使用属性的名称。
例如post_is: parent.id
batch
:使用batch loading。默认为False
模式描述
schemas:
<schema_name>:
url: <schema_url>
resolvers: <path/to/your/resolvers/file>
sdl:
- <list/of/paths/to/sdl/directories>
- <or/and/sdl/files>
rest:
- <list/of/paths/to/your/rest/description/files>
schema_name
:你的模式名url
:graphql端点的url(默认情况下等于架构名称)resolvers
:解析程序文件的路径(相对于基目录)sdl
:指向.graphql
文件(模式描述)或包含.graphql
文件的目录的路径列表rest
:rest定义文件的路径列表(相对于基目录)
REST应用程序连接示例
假设您有一个带有签名的REST服务: 输入:
{
id: [0, 1, 2],
q: "any search string"
}
输出:
{
"pagination": {
"total": 0,
"offset": 0,
"limit": 0
},
"result": [
{
"conditions": {},
"calculator_id": 0,
"version": 0,
"created": "2019-08-29T09:09:23.048Z",
"terms": [
0
],
"status": "archive",
"updated": "2019-08-29T09:09:23.048Z",
"amounts": [
0
],
"priority": 0,
"title": "string",
"meta": {},
"id": 0
}
]
}
要将api连接到GraphQL facade,请执行以下步骤:
预览
作为所有步骤的结果,我们得到了结构(我们将不使用的文件和目录被省略)
-app
-graphql
-calculator
-sdl
mutation.graphql
query.graphql
loaders.py
resolvers.yaml
rest.yaml
...
init_facade.yaml
...
...
.graphql
文件-数据模式的描述loaders.py
自定义解析器(如果需要)resolvers.yaml
解析程序说明rest.yaml
restapi服务说明init_facade.yaml
描述架构的所有架构和文件路径
文件方案是有条件的,不是强制性的,但建议遵守文件位置和命名的这一规则
1。描述数据模式
数据模式描述数据类型和参数 我们的休息服务将有以下表格
app/graphql/计算器/sdl/查询.graphql
type Query {
calculators(id: [Int], q: String): Calculators
}
type Calculators{
pagination: Pagination
result: [Calculator]
}
type Calculator {
id: Int
created: String
updated: String
calculator_id: Int
status: String
version: Int
title: String
amounts: [String]
terms: [Int]
meta: String
priority: Int
conditions: String
}
type Pagination {
total: Int
limit: Int
offset: Int
}
2。休息服务说明
REST描述文件包含有关REST处理程序的路径的信息
对于我们的API:
应用程序/图形/计算器/rest.json文件{
"calculator": {
"find_calculators": {
"method": "GET",
"path": "/api/v1/pdl_calculators/"
}
}
3。描述解析器
解析程序文件解释如何接收架构字段 (使用哪一个REST处理程序,是使用锡槽加载还是smth其他)
应用程序/图形/计算器/解析器.json{
"Query.calculators": {
"endpoint": "calculator.find_calculators"
}
}
4。主配置文件
应用程序/初始化_立面.yaml配置文件描述模式的文件位置
schemas:
calculator:
url: calculator
resolvers: app/graphql/calculator/resolvers
sdl:
- app/graphql/calculator/sdl
rest:
- app/graphql/calculator/rest
5。配置的基本url
重要的是不要忘记在应用程序设置中指定url 我们没有在yaml或json文件中指定baseurl来将baseurl作为环境变量传递
密钥必须与中的REST服务名称匹配休息.yaml文件
设置/配置.py
class Config:
...
BASE_URLS = {
...
'calculator': env.str('calculator_api', default='http:/calculator.prod.com')
...
}
...
批量装载
要使用批处理加载,必须遵循以下几个简单规则:
- REST API终结点必须符合ept
id
参数列表 - REST必须在
result
字段中返回记录列表(执行请求的条件),并将id
字段发送到每一行
例如:
{
"pagination": {
"total": 2,
"limit": 10,
"offset": 0
},
"result": [
{
"id": 1
},
{
"id": 2
}
],
"success": true
}
- 最后在字段解析程序描述中设置
batch
=True
:
Calculator.calculator:
endpoint: /api/v1/calculator
batch: True
- 项目
标签: