七月小說網 Python + GraphQL (三)


概述

后台數據庫幾個基本表基本搭建完畢,看了下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)

好了好了,該睡覺了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM