Flask是一个轻量级的WSGI Web应用程序框架。它旨在使入门快速简便,并能够扩展到复杂的应用程序。它最初是围绕WerkzeugJinja的简单包装器,并且已经成为最受欢迎的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

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'
__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