zoukankan      html  css  js  c++  java
  • Flask+SQLAlchemy+graphene+docker示例

    搭建一个利用docker启动服务的Flask的小demo

    定义数据库

    # -*- coding: utf-8 -*-
    
    
    from sqlalchemy import *
    from sqlalchemy.orm import (
        scoped_session, sessionmaker, relationship, backref
    )
    from sqlalchemy.ext.declarative import declarative_base
    
    
    # mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
    engine = create_engine("mysql+mysqlconnector://root:@localhost:3306/demo", convert_unicode=True)
    session = scoped_session(sessionmaker(
        autocommit=False, autoflush=False, bind=engine
    ))
    
    
    Base = declarative_base()
    Base.query = session.query_property()
    
    
    class Department(Base):
    
        __tablename__ = "department"
    
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
    
    
    class Employee(Base):
    
        __tablename__ = "employee"
    
        id = Column(Integer, primary_key=True)
        name = Column(String(50))
        hired_on = Column(DateTime, default=func.now())
        department_id = Column(Integer, ForeignKey("department.id"))
        department = relationship(
            Department,
            backref=backref(
                "employee",
                uselist=True,
                cascade="delete,all"
            )
        )
    
    

    利用SQLAlchemy定义了两个表,其中Department通过relationship可以关联多个Employee,然后通过python console创建表和数据:

    >>> from models import *
    >>>
    >>>
    >>> Base.metadata.create_all(bind=engine)
    >>>
    >>>
    >>> engineering = Department(name="Engineering")
    >>> session.add(engineering)
    >>> hr = Department(name="Human")
    >>> session.add(hr)
    >>>
    >>>
    >>> peter = Employee(name="Peter", department=engine)
    engine              engine_from_config( engineering
    >>> peter = Employee(name="Peter", department=engineering)
    >>>
    >>> session.add(peter)
    >>>
    >>>
    >>>
    >>> roy = Employee(name="Roy", department=engineering)
    >>>
    >>> session.add(roy)
    >>>
    >>>
    >>> tracy = Employee(name="Tracy", department=hr)
    >>>
    >>> session.add(tracy)
    

    定义graphql的的Query

    # -*- coding: utf-8 -*-
    
    
    from graphene import relay, ObjectType, Schema
    from graphene_sqlalchemy import (
        SQLAlchemyConnectionField, SQLAlchemyObjectType
    )
    
    from models import (
        Department as DepartmentModel,
        Employee as EmployeeModel
    )
    
    
    class Department(SQLAlchemyObjectType):
    
        class Meta:
            model = DepartmentModel
            interfaces = (relay.Node, )
    
    
    class DepartmentConnections(relay.Connection):
    
        class Meta:
            node = Department
    
    
    class Employee(SQLAlchemyObjectType):
    
        class Meta:
            model = EmployeeModel
            interfaces = (relay.Node, )
    
    
    class EmployeeConnections(relay.Connection):
    
        class Meta:
            node = Employee
    
    
    class Query(ObjectType):
    
        node = relay.Node.Field()
        all_employees = SQLAlchemyConnectionField(EmployeeConnections)
        all_departments = SQLAlchemyConnectionField(DepartmentConnections, sort=None)
    
    
    schema = Schema(query=Query)
    

    首先通过继承SQLAlchemyObjectType类来定义新的查询的类,然后通过relay.Connection来连接所定义的查询类,并且在Query中进行申明,其中我在Connection后面加了一个s是因为在github上看issue的时候发现在构造类的过程中会出现重名的情况导致申明Query的时候会报错,所以加一个s用来避免这个错误。
    其中有关graphene的部分我自己也还不是特别熟悉,所以只能是大概说一下自己的思路,如果有错误的地方会在后续中及时的进行修改,避免误人子弟。
    最终达到的效果是指定来一个schema,其中包含了我所定义的查询。

    本地启动

    # -*- coding: utf-8 -*-
    
    
    from flask import Flask
    from flask_graphql import GraphQLView
    
    from models import session
    from schema import schema
    
    
    app = Flask(__name__)
    app.debug = True
    
    
    app.add_url_rule(
        "/graphql",
        view_func=GraphQLView.as_view(
            "graphql",
            schema=schema,
            graphiql=True
        )
    )
    
    
    @app.teardown_appcontext
    def shutdown_session(exception=None):
        session.remove()
    
    
    if __name__ == "__main__":
        app.run()
    

    通过Flask的add_url_rule将graph的视图定义成通过路由可访问,然后启动就可以进行访问了,点击http://127.0.0.1:5000/graphql就可以本地访问了。

    通过docker启动

    • 建立镜像
    # run.docker
    FROM python:3.6
    
    COPY . /app
    
    WORKDIR /app
    
    RUN pip install -r requirements.txt
    
    CMD ["python", "app.py"]
    

    这个是我的Dockerfile,通过Dockerfile,我指定了这个镜像是来自于python:3.6这个镜像,然后把我当前目录下的所有内容通过COPY . /app复制到了docker镜像中的/app目录下,接着我指定了WORKDIR/app,这样我就可以在/app目录下进行操作了,首先是安装所有需要的依赖包,因为我是从python3.6拉的镜像,所以可以不用再去安装pip,直接就可以安装了,如果是其他镜像可能还要同构apt去安装pip再进行依赖包的安装,最后就是用CMD来运行文件了。

    docker build -t flask_sqlalchemy:core -f run.docker .
    # 其中的.是为了指明上下文路径,其实Dockerfile中的命令并不是对本地文件进行操作,而是通过指定上下文路径将这些文件传到docker搭建镜像的环境中再进行操作。
    

    镜像建立之后就可以run了

    docker run -d -p 5000:5000 --name flask-core flask_sqlalchemy:lastest
    

    然后就启动了。


  • 相关阅读:
    软件测试常见概念
    Apollo简介及工作原理
    bug的编写技巧与级别划分
    native与H5优缺点及H5测试
    优惠券测试
    go语言-for循环
    go语言-流程控制--if
    go语言-二进制与位运算
    cookie和session
    AJAX
  • 原文地址:https://www.cnblogs.com/zzy0306/p/10714087.html
Copyright © 2011-2022 走看看