七月小说网 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)

好了好了,该睡觉了。