플라스크로 GraphQL 서버 생성하기 > 파이썬

파이썬

그누 어디까지 써봤니? 나는 파이썬까지 써봤어!

플라스크로 GraphQL 서버 생성하기 정보

플라스크로 GraphQL 서버 생성하기

본문

800594872_1559520747.5296.png

 

지난 두 달 동안 저는 GraphQL을 사용하여 클라이언트 측에 데이터를 보내는 프로젝트를 진행했습니다. 그래서 내가 어떻게했는지에 대한 글을 쓰려고 생각했습니다.

 

GraphQL은 API에 대한 쿼리 언어이며 기존 데이터로 이러한 쿼리를 수행하기위한 런타임입니다. GraphQL은 API의 데이터에 대한 완벽하고 이해하기 쉬운 설명을 제공하고 고객에게 필요한 것을 정확히 물어볼 수있는 힘을 부여하며 시간이 지남에 따라 API를 쉽게 개발할 수있게하며 강력한 개발자 도구를 제공합니다.
GraphQL에 대한 자세한 내용은 여기를 참조하십시오.

 

이제 플라스크 프로젝트에서 구현하십시오.

Setting up your project

먼저 플라스크 프로젝트를 설정하십시오. 디렉토리 만들기

 

$ mkdir flask-graphql-project
$ cd flask-graphql-project

 

이제 가상 환경을 만듭니다. 이렇게하면 사용자 정의 Python 설치를 제공하여 프로젝트 종속성을 한 곳에서 유지할 수 있습니다. 이미 설치하지 않았다면 설치하십시오.

 

$ pip install virtualenv

 

이제 프로젝트의 가상 환경을 만들고 virtualenv를 활성화하십시오.

 

$ virtualenv venv
$ source venv/bin/activate

 

이렇게하면 프로젝트 폴더 내에 가상 환경이 만들어집니다. 그런 다음 프로젝트 종속성을 설치하십시오.

 

$ pip install flask flask-graphql flask-migrate flask-sqlalchemy graphene graphene-sqlalchemy

 

이제 폴더 루트 디렉토리에 app.py 파일을 만듭니다. 파일에 다음 코드를 추가하십시오.

 

# Imports
from flask import Flask
# app initialization
app = Flask(__name__)
app.debug = True
# Configs
# TO-DO
# Modules
# TO-DO
# Models
# TO-DO
# Schema Objects
# TO-DO
# Routes
# TO-DO
@app.route('/')
def index():
    return '<p> Hello World</p>'
if __name__ == '__main__':
     app.run()

 

우리가 진행함에 따라 to-do 주석이 채워질 것임에 유의하십시오.

이제 터미널에서 Python app.py runserver를 실행하면 디버그 서버가 설정되고 127.0.0.1:5000을 방문합니다. 페이지에 hello world가 쓰여 있으면 잘 읽으십시오.

Adding a database

이제 응용 프로그램에 데이터베이스를 추가합시다. 우리는 DB 모델을 만들기 위해 Sqlalchemy를 사용하고 데모 DB를 위해 SQLite를 사용할 것입니다.

app.py 파일에 다음 코드를 추가하십시오.

 

# Imports
...
from flask_sqlalchemy import SQLAlchemy
import os
basedir = os.path.abspath(os.path.dirname(__file__))
...
# Configs
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' +    os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# Modules
db = SQLAlchemy(app)
...

 

이제 모델을 만들 수 있습니다. app.py에 다음 코드를 추가합니다.

 

...
# Models
class User(db.Model):
    __tablename__ = 'users'
    uuid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(256), index=True, unique=True)
    posts = db.relationship('Post', backref='author')
    
    def __repr__(self):
        return '<User %r>' % self.username
class Post(db.Model):
    __tablename__ = 'posts'
    uuid = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(256), index=True)
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('users.uuid'))
    def __repr__(self):
        return '<Post %r>' % self.title
...

 

위의 코드에서 우리는 두 가지 모델 인 Posts and User를 만들고 두 모델 사이에 관계를 만들었습니다. 이제 데모 데이터를 만들어 보겠습니다.

 

$ python
>>> from app import db, User, Post
>>> db.create_all()
>>> john = User(username='johndoe')
>>> post = Post()
>>> post.title = "Hello World"
>>> post.body = "This is the first post"
>>> post.author = john
>>> db.session.add(post)
>>> db.session.add(john)
>>> db.session.commit()
>>> User.query.all()
[<User 'johndoe'>]
>>> Post.query.all()
[<Post 'Hello World'>

Adding GraphQL

이제 사업을 시작하십시오.

Schemas

GraphQL은 사용자가 익숙한 계층 적 구조가 아닌 그래프 구조로 개체를 세계에 제공합니다. 그래프에 표시 할 개체의 유형을 표시해야합니다. 바로 스키마가 들어옵니다. 스키마는 데이터를 설명하는 데 사용됩니다. 이제 모델에 대한 스키마를 작성해 보겠습니다.

 

app.py에 다음 내용을 추가하십시오.

 

# Imports
...
import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
...
# Schema Objects
class PostObject(SQLAlchemyObjectType):
    class Meta:
        model = Post
        interfaces = (graphene.relay.Node, )
class UserObject(SQLAlchemyObjectType):
   class Meta:
       model = User
       interfaces = (graphene.relay.Node, )
class Query(graphene.ObjectType):
    node = graphene.relay.Node.Field()
    all_posts = SQLAlchemyConnectionField(PostObject)
    all_users = SQLAlchemyConnectionField(UserObject)
schema = graphene.Schema(query=Query)
...

 

이제 GraphQL 인터페이스를 확인하기위한 경로를 추가하십시오.

 

# Imports
...
from flask_graphql import GraphQLView
...
# Routes
...
app.add_url_rule(
    '/graphql',
    view_func=GraphQLView.as_view(
        'graphql',
        schema=schema,
        graphiql=True # for having the GraphiQL interface
    )
)
...

 

이제 127.0.0.1:5000/graphql로 이동하면 GraphQLi보기가 표시됩니다.  GraphQL 쿼리 작성해봅니다.

{
  allPosts{
    edges{
      node{
        title
        body
        author{
          username
        }
      }
    }
  }
}

Mutations

게시물과 사용자를 만들려면 뮤테이션이 있어야합니다. 이제 우리 앱에 추가해 보겠습니다.

 

...
# Schema Objects
...
class CreatePost(graphene.Mutation):
    class Arguments:
        title = graphene.String(required=True)
        body = graphene.String(required=True) 
        username = graphene.String(required=True)
    post = graphene.Field(lambda: PostObject)
    def mutate(self, info, title, body, username):
        user = User.query.filter_by(username=username).first()
        post = Post(title=title, body=body)
        if user is not None:
            post.author = user
        db.session.add(post)
        db.session.commit()
        return CreatePost(post=post)
class Mutation(graphene.ObjectType):
    create_post = CreatePost.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)

 

이제 GraphQL 돌연변이가있는 새 게시물을 추가해 보겠습니다.

 

mutation {
  createPost(username:"johndoe", title:"Hello 2", body:"Hello body 2"){
    post{
      title
      body
      author{
        username
      }
    }
  }
}

Flask을 사용하여 GraphQL 서버를 성공적으로 시작했습니다. 게시물에 개선점이 있으므로 추가하고 싶은 것이 있으면 의견을 말하십시오 ?

이 게시물이 도움이 되었다면 가능한 한 박수 버튼을 클릭하십시오. 고맙습니다.

추천
0

댓글 0개

전체 121 |RSS
파이썬 내용 검색

회원로그인

진행중 포인트경매

  1. 참여71 회 시작24.04.19 15:40 종료24.04.26 15:40
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT