七月小說網 Python + GraphQL (三)
- 2019 年 10 月 5 日
- 筆記
概述
後台資料庫幾個基本表基本搭建完畢,看了下Github Develop的V4 Api拋棄了RESTful,採用GraphQL,感覺很有意思,一看文檔,竟然有Python的開源實現 Graphene ,這就很舒服了。 反正也是學習,搞起來。
Flask + Graphene + SQLAlchamy + MariaDB
花了點小時間的,搞出了我的第一個GraphQL介面。還是有點意思的。
findBookTypes{ edges{ node{ typeId typeName parentTypeId summary } } }
上邊就是個GraphQL的query語句。
Flask CORS
之前我是手動設置,每個路由都要設置一下Access-Control-Allow-Origin
,結果調用了一個Flask GraphQL的庫,response被它封裝起來了,皮的很。我又不想去手動改他的庫,故而找到這個 Flask CORS庫還是很給力的,一鍵配置跨域。 現在的開源,是真的給力哦,果斷star
app = Flask(__name__) CORS(app, supports_credentials=True)
SQLAlchamy 語法
跟傳統sql語句還是有點區別的,得花點時間研究研究怎麼把傳統sql語句弄成符合這款ORM框架的語法。先弄點常用的用用。 跟表關聯 ORM
"""作品相關""" class BookType(Base): """作品類別""" __tablename__ = 'BOOK_TYPE' type_id = Column(Integer, primary_key=True) type_name = Column(String(255)) summary = Column(String(255)) parent_type_id = Column(Integer) state = Column(Integer) createtime = Column(DateTime)
查詢
query.filter(BookTypeModel.parent_type_id==args.get('parentTypeId')) Books.get_query(info).filter(BookModel.book_id==input.get('book_id')).first()
Graphene 規則
這個庫還是要跟著文檔走,裡面語法不能錯,否則很容易出錯。 還有就是github上有些程式碼是基於老版本的,照著寫也會出錯,所以要注意版本升級。給個例子吧:
class Query(graphene.ObjectType): node = relay.Node.Field() findBookTypes = SQLAlchemyConnectionField(BookTypes, typeId=graphene.Int(), parentTypeId=graphene.Int(), description="通過typeId或者parentTypeId查詢書類") def resolve_findBookTypes(self, info, **args): query = BookTypes.get_query(info) if args.get('typeId') is not None: return query.filter(BookTypeModel.type_id==args.get('typeId')) elif args.get('parentTypeId') is not None: return query.filter(BookTypeModel.parent_type_id==args.get('parentTypeId')) else: return query findRanks = SQLAlchemyConnectionField(BookTypes, rankTypeId=graphene.Int(required=True), description="通過rankTypeId查詢排行榜") def resolve_findRanks(self, info, rankTypeId): query = Ranks.get_query(info) return query.filter(RankModel.rank_type_id==rankTypeId)
好了好了,該睡覺了。