通過(guò)Graphene,你可以快速構(gòu)建出一個(gè)支持按需查詢(xún)、實(shí)時(shí)更新的API服務(wù)。我們開(kāi)始這段有趣的學(xué)習(xí)之旅吧!

1. 快速入門(mén)

先安裝Graphene:

pip install graphene

小貼士:如果你計(jì)劃與Django一起使用,可以安裝 graphene-django。

2. 定義你的第一個(gè)Schema

GraphQL中,Schema定義了API的類(lèi)型系統(tǒng)。我們創(chuàng)建一個(gè)簡(jiǎn)單的圖書(shū)管理系統(tǒng):

import graphene

class Author(graphene.ObjectType):
"""作者信息"""
name = graphene.String(description="作者姓名")
books = graphene.List(lambda: Book, description="作者的作品")

class Book(graphene.ObjectType):
"""書(shū)籍信息"""
title = graphene.String(description="書(shū)籍標(biāo)題")
author = graphene.Field(Author, description="作者")
pages = graphene.Int(description="頁(yè)數(shù)")
price = graphene.Float(description="價(jià)格")

# 創(chuàng)建查詢(xún)
class Query(graphene.ObjectType):
books = graphene.List(Book, description="所有書(shū)籍")
author = graphene.Field(
Author,
name=graphene.String(required=True),
description="根據(jù)姓名查詢(xún)作者"
)

def resolve_books(self, info):
"""獲取所有書(shū)籍"""
return get_books() # 實(shí)際項(xiàng)目中從數(shù)據(jù)庫(kù)獲取

def resolve_author(self, info, name):
"""根據(jù)姓名查詢(xún)作者"""
return get_author_by_name(name) # 實(shí)際項(xiàng)目中從數(shù)據(jù)庫(kù)獲取

schema = graphene.Schema(query=Query)

一句話總結(jié):Schema是GraphQL API的骨架,定義了可查詢(xún)的數(shù)據(jù)結(jié)構(gòu)和類(lèi)型。

3. 添加修改操作(Mutations)

class CreateBook(graphene.Mutation):
"""創(chuàng)建新書(shū)籍"""
class Arguments:
title = graphene.String(required=True)
author_name = graphene.String(required=True)
pages = graphene.Int()
price = graphene.Float()

book = graphene.Field(Book)

def mutate(self, info, title, author_name, pages=None, price=None):
author = get_or_create_author(author_name)
book = create_book(title=title, author=author, pages=pages, price=price)
return CreateBook(book=book)

class Mutation(graphene.ObjectType):
create_book = CreateBook.Field()

# 更新schema
schema = graphene.Schema(query=Query, mutation=Mutation)

注意事項(xiàng):

4. 集成到Web框架

以Flask為例,讓我們創(chuàng)建一個(gè)GraphQL endpoint:

from flask import Flask
from flask_graphql import GraphQLView

app = Flask(__name__)

app.add_url_rule(
'/graphql',
view_func=GraphQLView.as_view(
'graphql',
schema=schema,
graphiql=True # 啟用GraphiQL界面
)
)

if __name__ == '__main__':
app.run(debug=True)

小貼士:GraphiQL是一個(gè)超好用的調(diào)試工具,可以直接在瀏覽器中測(cè)試查詢(xún)。

5. 高級(jí)特性

接口和聯(lián)合類(lèi)型

class SearchResult(graphene.Union):
"""搜索結(jié)果可能是書(shū)籍或作者"""
class Meta:
types = (Book, Author)

class Node(graphene.Interface):
"""可查詢(xún)節(jié)點(diǎn)的接口"""
id = graphene.ID(required=True)

class Book(graphene.ObjectType):
class Meta:
interfaces = (Node,)

數(shù)據(jù)加載優(yōu)化

from promise import Promise
from promise.dataloader import DataLoader

class AuthorLoader(DataLoader):
def batch_load_fn(self, keys):
authors = get_authors_by_ids(keys) # 批量查詢(xún)作者
return Promise.resolve([
next((a for a in authors if a.id == key), None)
for key in keys
])

# 在resolve方法中使用
def resolve_author(self, info):
return info.context.author_loader.load(self.author_id)

總結(jié)與練習(xí)

今天我們學(xué)習(xí)了:

  1. Schema的定義和使用
  2. 查詢(xún)和修改操作的實(shí)現(xiàn)
  3. Web框架集成
  4. 高級(jí)特性和優(yōu)化技巧

練習(xí)題:

  1. 嘗試為圖書(shū)管理系統(tǒng)添加”刪除書(shū)籍”和”更新作者信息”的mutation。
  2. 擴(kuò)展題:如何實(shí)現(xiàn)一個(gè)分頁(yè)查詢(xún),讓客戶端能夠分批獲取大量數(shù)據(jù)?

實(shí)踐建議:

GraphQL提供了極大的靈活性,但也需要我們合理設(shè)計(jì)Schema以避免過(guò)度復(fù)雜。希望這篇教程能幫助你開(kāi)啟GraphQL之旅!??

文章轉(zhuǎn)自微信公眾號(hào)@愛(ài)刷牙的雙髻鯊

上一篇:

一次非常普通的短信轟炸 AND【TangGo】第三方API調(diào)用驗(yàn)證碼識(shí)別

下一篇:

PyGraphQL-API,GraphQL查詢(xún)的完美方案!
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)