3.定義Schema和類型

讓我們通過一個簡單的圖書管理系統來學習GraphQL。首先定義數據類型:

python

復制

importgraphene

classBook(graphene.ObjectType): title=graphene.String() author=graphene.String() published_year=graphene.Int()

classAuthor(graphene.ObjectType): name=graphene.String() books=graphene.List(Book)

4.創建查詢

接下來,我們來定義查詢類:

python

復制

classQuery(graphene.ObjectType): book=graphene.Field(Book,title=graphene.String()) all_books=graphene.List(Book)

defresolve_book(self,info,title):

這里模擬數據庫查詢

returnBook( title=title, author=“向前”, published_year=2024 )

defresolve_all_books(self,info):

返回圖書列表

return[ Book(title=“Python進階”,author=“向前”,published_year=2024), Book(title=“GraphQL實戰”,author=“向前”,published_year=2024) ]

schema=graphene.Schema(query=Query)

5.執行查詢

現在讓我們來執行一些查詢:

python

復制

查詢單本書

query=”’ query{ book(title:“Python進階”){ title author publishedYear } } ”’

result=schema.execute(query) print(result.data)

小貼士:GraphQL的查詢語句看起來很像JSON,但它有自己特殊的語法規則。字段名使用駝峰式命名規則(camelCase)。

6.添加變更(Mutation)

除了查詢,我們還可以通過mutation來修改數據:

python

復制

classCreateBook(graphene.Mutation): classArguments: title=graphene.String() author=graphene.String() published_year=graphene.Int()

book=graphene.Field(Book)

defmutate(self,info,title,author,published_year): book=Book(title=title,author=author,published_year=published_year)

這里應該添加保存到數據庫的代碼

returnCreateBook(book=book)

classMutation(graphene.ObjectType): create_book=CreateBook.Field()

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

使用mutation添加新書:

python

復制

mutation=”’ mutation{ createBook(title:“GraphQL入門”,author:“向前”,publishedYear:2024){ book{ title author publishedYear } } } ”’

result=schema.execute(mutation) print(result.data)

7.實用技巧

1.錯誤處理GraphQL會返回詳細的錯誤信息,包括具體的字段和原因。

2.查詢優化:可以使用only()select_related()來優化數據庫查詢。

3.字段別名:可以給字段取別名,避免命名沖突:

python

復制

query=”’ query{ pythonBook:book(title:“Python進階”){ title } graphqlBook:book(title:“GraphQL實戰”){ title } } ”’

注意事項:

在生產環境中,記得添加適當的身份驗證和權限控制 對查詢的深度和復雜度進行限制,避免惡意查詢 *合理使用數據加載器(DataLoader)來避免N+1查詢問題

8.練習題

1.嘗試給Book類型添加一個price字段,并修改相關的查詢和變更操作 2.實現一個刪除圖書的mutation 3.添加一個按作者名查詢所有圖書的查詢

小伙伴們,今天的Python學習之旅就到這里啦!

GraphQL確實是一個強大的API查詢工具,它能讓我們的數據獲取更加精確和高效。

記得動手實踐哦,有問題隨時在評論區問向前。

祝大家學習愉快,Python學習節節高!

復制markdown

復制

PyGraphQL-API進階:深入GraphQL的高級特性!

大家好,我是向前!上一篇文章我們學習了GraphQL的基礎知識,今天讓我們繼續深入探索GraphQL在Python中的一些高級特性和實用技巧!

9.接口和聯合類型

GraphQL中,接口(Interface)和聯合類型(Union)是兩個非常實用的高級特性。

接口實現

“`python importgraphene

classHasAuthor(graphene.Interface): author=graphene.String() publish_date=graphene.String()

classArticle(graphene.ObjectType): classMeta: interfaces=(HasAuthor,)

title=graphene.String() content=graphene.String()

classBook(graphene.ObjectType): classMeta: interfaces=(HasAuthor,)

title=graphene.String() isbn=graphene.String()

聯合類型

python

復制

classSearchResult(graphene.Union): classMeta: types=(Article,Book)

classQuery(graphene.ObjectType): search=graphene.List(SearchResult,keyword=graphene.String())

defresolve_search(self,info,keyword):

模擬搜索結果

results=[ Article( title=“GraphQL教程”, content=“GraphQL入門指南”, author=“向前”, publish_date=“2024-01-01” ), Book( title=“Python實戰”, isbn=“123-456-789”, author=“向前”, publish_date=“2024-02-01” ) ] returnresults

10.數據加載優化

為了解決N+1查詢問題,我們可以使用Promise和DataLoader:

python

復制

frompromiseimportPromise frompromise.dataloaderimportDataLoader

classBookLoader(DataLoader): defbatch_load_fn(self,keys):

模擬批量查詢數據庫

books=[ {“id”:k,“title”:f“Book{k}”,“author”:“向前”} forkinkeys ] returnPromise.resolve(books)

book_loader=BookLoader()

classQuery(graphene.ObjectType): books=graphene.List( Book, ids=graphene.List(graphene.ID) )

defresolve_books(self,info,ids): returnbook_loader.load_many(ids)

11.自定義標量類型

有時候我們需要自定義數據類型,比如日期或JSON:

python

復制

importjson fromgraphene.typesimportScalar fromdatetimeimportdatetime

classJSONScalar(Scalar): @staticmethod defserialize(dt): returnjson.dumps(dt)

@staticmethod defparse_literal(node): returnjson.loads(node.value)

@staticmethod defparse_value(value): returnjson.loads(value)

classDateTimeScalar(Scalar): @staticmethod defserialize(dt): returndt.isoformat()

@staticmethod defparse_value(value): returndatetime.fromisoformat(value)

classBook(graphene.ObjectType): metadata=JSONScalar() published_at=DateTimeScalar()

12.訂閱功能

GraphQL還支持實時訂閱功能,這在需要實時更新的場景非常有用:

python

復制

importasyncio fromgrapheneimportObjectType,Field,String

classSubscription(ObjectType): count=Field(String)

asyncdefresolve_count(root,info):

模擬實時數據流

foriinrange(5): yieldf“Count:{i}” awaitasyncio.sleep(1)

schema=graphene.Schema( query=Query, mutation=Mutation, subscription=Subscription )

13.中間件實現

中間件可以幫助我們處理認證、日志等通用邏輯:

python

復制

classAuthMiddleware: defresolve(self,next,root,info,args): ifnotinfo.context.get(‘is_authenticated’): raiseException(‘Authenticationrequired’) returnnext(root,info,args)

classLoggingMiddleware: defresolve(self,next,root,info,args): start=time.time() result=next(root,info,args) duration=time.time()-start print(f“Field{info.field_name}took{duration}storesolve”) returnresult

schema=graphene.Schema( query=Query, mutation=Mutation, middleware=[AuthMiddleware(),LoggingMiddleware()] )

14.性能優化小貼士

1.查詢復雜度控制

python

復制

fromgraphene.validationimportvalidate_max_depth

defvalidate_query(query_string): returnvalidate_max_depth(query_string,max_depth=5)

2.批量數據獲取

python

復制

classQuery(graphene.ObjectType): books=graphene.List( Book, first=graphene.Int(), offset=graphene.Int() )

defresolve_books(self,info,first=None,offset=None): books=get_books()#獲取所有圖書 ifoffsetisnotNone: books=books[offset:] iffirstisnotNone: books=books[:first] returnbooks

15.實用練習題

1.實現一個支持圖書評論的系統,使用接口定義共同的用戶行為 2.添加一個實時訂閱功能,當有新書上架時通知訂閱者 3.實現一個通用的緩存中間件,緩存查詢結果

小貼士:

在使用DataLoader時,注意將loader實例存儲在上下文中,避免創建多個實例?訂閱功能需要使用支持異步的服務器,如FastAPI或Starlette *自定義標量類型時要考慮輸入驗證和錯誤處理

小伙伴們,今天的Python學習之旅就到這里啦!

我們學習了GraphQL的一些高級特性,相信這些知識會讓你的API開發更上一層樓。

記得動手實踐哦,有問題隨時在評論區問向前。

祝大家學習愉快,Python學習節節高!

文章轉自微信公眾號@影書劇

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
Graphene:構建優雅的GraphQL API
下一篇
優化利潤:計算并報告OpenAI支持的API的COGS
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
91日韩在线专区| 国产精品香蕉一区二区三区| 精品在线你懂的| 色哟哟精品一区| 久久一二三国产| 亚洲精品乱码久久久久久| 亚洲高清免费观看高清完整版在线观看 | 狠狠色狠狠色合久久伊人| 91麻豆国产自产在线观看| 日韩精品一区在线观看| 欧美一级精品大片| 亚洲免费成人av| av综合在线播放| 亚洲精品视频一区二区| 成人激情免费网站| 亚洲激情在线激情| 欧美顶级少妇做爰| 国内成人免费视频| 在线不卡的av| 成人三级伦理片| 亚洲一区二区中文在线| 色就色 综合激情| 亚洲国产精品视频| 日韩一区二区三区免费看| 国产成人精品亚洲777人妖| 日韩二区三区在线观看| av一区二区三区四区| 久久精品国产亚洲高清剧情介绍 | 国产精品一级片在线观看| 国产欧美日韩精品一区| 欧美精品在欧美一区二区少妇| 韩国成人福利片在线播放| 亚洲成人av一区二区| 最新高清无码专区| 欧美成人一区二区| 91精品国产色综合久久不卡蜜臀| 粉嫩av亚洲一区二区图片| 亚洲国产三级在线| 图片区小说区国产精品视频| 亚洲欧洲日产国码二区| 久久综合久久综合亚洲| 久久久九九九九| 国产精品视频看| 国产精品久久精品日日| 亚洲人成小说网站色在线| 中文字幕在线播放不卡一区| 久久久精品天堂| 国产精品乱码人人做人人爱| 亚洲精品国产成人久久av盗摄| 亚洲欧美日本在线| 丝袜亚洲另类欧美综合| 日韩不卡一区二区三区| 成人久久久精品乱码一区二区三区| 国产成人亚洲综合a∨猫咪| 国产一区二区毛片| 色老汉一区二区三区| 日韩女优av电影| 亚洲男帅同性gay1069| 另类小说图片综合网| 91在线观看下载| 国产婷婷色一区二区三区四区| 亚洲444eee在线观看| 国模一区二区三区白浆| 91久久精品一区二区二区| 中文字幕巨乱亚洲| 成人性生交大片免费看视频在线 | 欧美日韩久久久久久| 欧美写真视频网站| 日韩av不卡一区二区| 美女视频一区二区三区| 日韩欧美二区三区| 首页欧美精品中文字幕| 在线视频一区二区三区| 欧美老肥妇做.爰bbww视频| 日韩极品在线观看| 国产成人av一区二区三区在线| 蜜臀久久99精品久久久画质超高清 | 一本久久a久久免费精品不卡| 日本韩国欧美一区| 日韩精品在线网站| 日韩码欧中文字| 日韩av电影免费观看高清完整版 | 成人免费在线播放视频| 肉肉av福利一精品导航| 国产伦精一区二区三区| 欧美在线观看一区二区| 国产三级精品视频| 日韩国产在线一| 99精品久久只有精品| 国产精一区二区三区| 亚洲国产精品精华液ab| 欧美国产日本视频| 国产精品久久福利| 欧美日韩在线播放一区| 亚洲图片有声小说| 免费看精品久久片| 国产精品美女久久久久aⅴ | 国产欧美日韩麻豆91| 国产精品伦一区| 欧美高清激情brazzers| a在线欧美一区| 中文字幕亚洲一区二区av在线| 在线观看精品一区| 亚洲国产精品久久不卡毛片| 91精品国产欧美一区二区| 欧美一区二区日韩| 亚洲制服丝袜在线| 亚洲成人av免费| 色综合天天性综合| 欧美激情一区二区三区在线| 美女一区二区三区| 宅男在线国产精品| 爽好多水快深点欧美视频| 欧美日韩一区二区在线观看| 亚洲午夜电影在线| 欧美日韩国产免费一区二区| 亚洲精品欧美在线| 欧美性色黄大片| 日本成人在线视频网站| 欧美变态口味重另类| 老司机精品视频导航| 久久夜色精品国产噜噜av| 国产乱码精品一区二区三区五月婷| 精品精品欲导航| 岛国av在线一区| 欧美国产欧美综合| 日本高清不卡一区| 欧美一区日韩一区| 国产精品久久久久影院亚瑟| 久久精品亚洲麻豆av一区二区 | 成人a级免费电影| 青青草视频一区| 日韩不卡手机在线v区| 麻豆视频一区二区| 日韩精品免费专区| 五月天久久比比资源色| 欧美变态口味重另类| 久久成人免费网站| 亚洲午夜免费电影| 欧美96一区二区免费视频| 成人av免费在线播放| 91精品在线免费观看| 国产精品久久久久久久蜜臀 | 97精品久久久午夜一区二区三区 | 九九九久久久精品| 黄色小说综合网站| 一区二区久久久久久| 国产精品私房写真福利视频| 成人三级在线视频| 一区二区三区在线观看视频| 亚洲欧洲国产日韩| 国产精品色呦呦| 亚洲精品福利视频网站| 久久成人麻豆午夜电影| 欧美巨大另类极品videosbest| 岛国精品在线观看| 欧美三级午夜理伦三级中视频| 色综合天天综合色综合av| 欧美日韩激情一区二区| 欧美午夜一区二区三区| 日韩欧美一区在线观看| 精品国产污网站| 一级日本不卡的影视| 亚洲一区在线看| 奇米影视7777精品一区二区| 成人av动漫在线| 亚洲欧洲精品成人久久奇米网| 欧美精品日韩综合在线| 欧美在线观看18| 久久免费美女视频| 看片的网站亚洲| 欧美日韩一区久久| 亚洲一区影音先锋| 成人精品视频.| 国产亚洲欧美一级| 国产精品一区专区| 91精品黄色片免费大全| 午夜一区二区三区视频| 91麻豆自制传媒国产之光| 国产日韩一级二级三级| 国产自产2019最新不卡| 日韩免费视频线观看| 久久精品国产一区二区三| 欧美日韩在线观看一区二区| 丝袜亚洲精品中文字幕一区| 日韩视频中午一区| 成人精品gif动图一区| 中文字幕一区在线观看视频| 国产成人自拍网| 亚洲欧美一区二区三区国产精品| 婷婷久久综合九色综合绿巨人| 91精品国产综合久久精品性色| 麻豆成人免费电影| 欧美亚洲愉拍一区二区| 欧美激情一区三区| xf在线a精品一区二区视频网站| bt欧美亚洲午夜电影天堂| 人妖欧美一区二区| 五月天婷婷综合| 视频一区在线播放|