如何将GraphQL集成到Python Flask
在本指南中我们将会连接这些知识和Flask GraphQL,virtualenv, Graphene, Flask包,以及考虑如何将他们整合在一起工作,让这些包来简化我们的工作
Flask是一个轻量级的WSGI Web应用程序框架。它旨在使入门快速简便,并能够扩展到复杂的应用程序。它最初是围绕Werkzeug 和Jinja的简单包装器,并且已经成为最受欢迎的Python Web应用程序框架之一。
Graphene是一个库,它提供了GraphQL在Python中的实现。Graphene类似于Apollo Server(JavaScript)Graphene完全适用于最流行的Web框架和ORM的集成。Graphene生成的模式完全符合GraphQL规范,并提供用于构建Relay-Compliant API的工具和模式。
GraphQL是API的查询语言。
它提供了一种标准方式:
- 使用静态类型的Schema描述服务器提供的数据
- 在查询请求中的API准确描述你需要的数据
- 在响应中仅包含您请求的数据。
有关GraphQL的介绍及其概念的概述,请参阅官方的GraphQL文档。
virtualenv
是一个创建孤立的Python环境的工具。从Python 3.3开始,它的一个子集已经集成到venv模块下的标准库中 。它让每个项目都有自己独立环境,从而解决你把所有模块安装到系统产生的无限依赖,版本错误依赖的问题
Flask Graphql包提供了flask与graphql连接的实现
在本指南中我们将会连接这些知识和Flask GraphQL,virtualenv,
Graphene, Flask包,以及考虑如何将他们整合在一起工作,让这些包来简化我们的工作
前提条件
你必须熟悉以下工具的使用,它们非常简单,相信你很快就会掌握
- Python
- pip
- Virtualenv
安装Virtualenv
pip install virtualenv
配置Flask
我们遵循官方文档创建一个应用程序的布局,以便于测试,开发和部署,在此之前先创建一个虚拟环境,使用Virtualenv
mkdir ~/py
cd ~/py
virtualenv venv
source venv/bin/activate # activate Virtualenv
创建官方推荐的目录布局,请按照下面目录结构,当然用不上暂时可以不用创建
/home/user/Projects/flask-tutorial
├── flaskr/
│ ├── __init__.py
│ ├── db.py
│ ├── schema.sql
│ ├── auth.py
│ ├── blog.py
│ ├── templates/
│ │ ├── base.html
│ │ ├── auth/
│ │ │ ├── login.html
│ │ │ └── register.html
│ │ └── blog/
│ │ ├── create.html
│ │ ├── index.html
│ │ └── update.html
│ └── static/
│ └── style.css
├── tests/
│ ├── conftest.py
│ ├── data.sql
│ ├── test_factory.py
│ ├── test_db.py
│ ├── test_auth.py
│ └── test_blog.py
├── venv/
├── setup.py
└── MANIFEST.in
这里只创建tests,flaskr
cd ~/py
mkdir -p tests flaskr
创建你的第一个Flask web应用
安装flask包
pip install flask
配置web应用的入口
在flaskr目录中添加文件__init__.py,__init__.py文件曾经是python包的一部分,它标记着文件所在目录作为一个包,当导入这个包时就会被隐式执行__init__.py,这将会作为在接下来执行flask run命令的入口
~/py/flaskr/__init__.py
启动flask应用
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
在浏览器中输入http://127.0.0.1:5000/,你将会在浏览器看到hello world的输出
现在我们已经配置完一个基本的服务器,接下来将会集成Graphene,Flask Graphql
集成Graphene和Flask以及GraphQL
将他们集成一起工作也是一件很简单的事情,我们只需要在__init__.py导入Graphene和Flask-GraphQL包
安装Flask-GraphQL和Graphene
pip install Flask-GraphQL graphene
添加graphql入口点到Flask
在__init__.py中导入GraphQLView,ObjectType, String, Schema
...
from flask_graphql import GraphQLView
from graphene import ObjectType, String, Schema
...
app.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True))
添加schema
class Query(ObjectType):
# this defines a Field `hello` in our Schema with a single Argument `name`
hello = String(name=String(default_value="stranger"))
goodbye = String()
# our Resolver method takes the GraphQL context (root, info) as well as
# Argument (name) for the Field and returns data for the query Response
def resolve_hello(root, info, name):
return 'Hello {name}!'
def resolve_goodbye(root, info):
return 'See ya!'
schema = Schema(query=Query)
完整示例
from flask import Flask
from flask_graphql import GraphQLView
from graphene import ObjectType, String, Schema
class Query(ObjectType):
# this defines a Field `hello` in our Schema with a single Argument `name`
hello = String(name=String(default_value="stranger"))
goodbye = String()
# our Resolver method takes the GraphQL context (root, info) as well as
# Argument (name) for the Field and returns data for the query Response
def resolve_hello(root, info, name):
return 'Hello {name}!'
def resolve_goodbye(root, info):
return 'See ya!'
schema = Schema(query=Query)
def create_app():
app = Flask(__name__)
app.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True))
# Optional, for adding batch query support (used in Apollo-Client)
# app.add_url_rule('/graphql/batch', view_func=GraphQLView.as_view('graphql', schema=schema, batch=True))
@app.route("/")
def hello_world():
return "Hello World!"
return app
在开发模式下flask应用是常驻内存的,当你的变更后,flask应用将会重启,你将会看到如下输出
* Detected change in '/home/workspace/huangyanxiong/work/python/flasks/flaskr/__init__.py', reloading
* Restarting with stat
* Debugger is active!
* Debugger PIN: 113-881-626
所以你不需要每次更改代码后,再重启flask应用
现在在你浏览器中打开http://127.0.0.1:5000/graphql你将会看到一个GraphQL查询工具,最后记得使用下面的命令导出所有依赖,将依赖的版本固定下来,当第二次部署,就不会产生不确定性的问题
pip freeze > requirements.txt
结论
至此,你已经熟悉flask web应用的创建,并且可以使用GraphQL创建一个简单的查询,也了解如何使用virtualenv