Flask Rest API -파트:2- Blueprint 및 Flask-restful로 더 나은 구조

파트 2: Blueprint 및 Flask-restful을 사용한 더 나은 구조



안녕! 이전 시리즈에서 Mongoengine를 사용하여 영화 데이터를 MongoDB 데이터베이스에 저장하는 방법을 배웠습니다. 이제 좀 더 유지 관리 가능한 방식으로 플라스크 응용 프로그램을 구성하는 방법을 알아보겠습니다.

이 부분부터 시작했다면 지금까지 작성한 모든 코드를 찾을 수 있습니다here.

플라스크 애플리케이션을 구성하는 두 가지 방법을 배울 것입니다.
  • Blueprint : Flask 응용 프로그램을 다른 구성 요소로 구성하는 데 사용되며, 다른 기능을 기반으로 응용 프로그램을 구성합니다.
  • Flask-restful : REST API를 빠르게 빌드하고 모범 사례를 따르는 데 도움이 되는 Flask용 확장입니다.

  • 참고: BlueprintFlask-restful는 서로를 대체하지 않으며 단일 프로젝트에서 공존할 수 있습니다.

    Blueprint를 사용하여 Flask 앱 구성


    resources 안에 새 폴더mongo-bag를 만들고 movie.py 안에 새 파일resources.을 만듭니다.

    mkdir resources
    cd resources
    touch movie.py
    

    이제 모든 경로 관련 코드를 app.py에서 movies.py로 이동하십시오.

    #~/movie-bag/resources/movie.py
    
    @app.route('/movies')
    def get_movies():
     movies = Movie.objects().to_json()
     return Response(movies, mimetype="application/json", status=200)
    
    @app.route('/movies', methods=['POST'])
    def add_movie():
     body = request.get_json()
     movie = Movie(**body).save()
     id = movie.id
     return {'id': str(id)}, 200
    
    @app.route('/movies/<id>', methods=['PUT'])
    def update_movie(id):
     body = request.get_json()
     Movie.objects.get(id=id).update(**body)
     return '', 200
    
    @app.route('/movies/<id>', methods=['DELETE'])
    def delete_movie(id):
     movie = Movie.objects.get(id=id).delete()
     return '', 200
    
    @app.route('/movies/<id>')
    def get_movie(id):
     movies = Movie.objects.get(id=id).to_json()
     return Response(movies, mimetype="application/json", status=200)
    

    그리고 app.py 파일은 다음과 같아야 합니다.

    #~/movie-bag/app.py
    
    from flask import Flask, request, Response
    from database.db import initialize_db
    from database.models import Movie
    import json
    
    app = Flask(__name__)
    
    app.config['MONGODB_SETTINGS'] = {
     'host': 'mongodb://localhost/movie-bag'
    }
    
    initialize_db(app)
    
    app.run()
    
    



    깨끗하죠?
    이제 이것이 어떻게 작동하는지 궁금할 것입니다. - 작동하지 않습니다.
    먼저 movie.py에서 청사진을 생성해야 합니다.

    다음과 같이 movie.py를 업데이트하십시오.

    #~/movie-bag/resources/movie.py
    
    +from flask import Blueprint, Response, request
    +from database.models import Movie
    +
    +movies = Blueprint('movies', __name__)
    
    [email protected]('/movies')
    [email protected]('/movies')
    def get_movies():
     movies = Movie.objects().to_json()
     return Response(movies, mimetype="application/json", status=200)
    
    [email protected]('/movies', methods=['POST'])
    [email protected]('/movies', methods=['POST'])
    def add_movie():
     body = request.get_json()
     movie = Movie(**body).save()
     id = movie.id
     return {'id': str(id)}, 200
    
    [email protected]('/movies/<id>', methods=['PUT'])
    [email protected]('/movies/<id>', methods=['PUT'])
    def update_movie(id):
     body = request.get_json()
     Movie.objects.get(id=id).update(**body)
     return '', 200
    
    [email protected]('/movies/<id>', methods=['DELETE'])
    [email protected]('/movies/<id>', methods=['DELETE'])
    def delete_movie(id):
     movie = Movie.objects.get(id=id).delete()
     return '', 200
    
    [email protected]('/movies/<id>')
    [email protected]('/movies/<id>')
    def get_movie(id):
     movies = Movie.objects.get(id=id).to_json()
     return Response(movies, mimetype="application/json", status=200)
    

    그래서 우리는 다음을 사용하여 새로운 Blueprint를 만들었습니다.

    +movies = Blueprint('movies', __name__)
    

    인수 nameimport_name . 일반적으로 import_name은 현재 모듈의 이름을 포함하는 특수 Python 변수인 __name__ 입니다.

    이제 이 app 안에 있는 Blueprint 의 모든 인스턴스를 movies 로 바꿀 수 있습니다.

    따라서 우리가 만든 app.py를 등록하도록 Blueprint를 업데이트합시다.

    #~/movie-bag/app.py
    
    -from flask import Flask, request, Response
    +from flask import Flask
    from database.db import initialize_db
    -from database.models import Movie
    -import json
    +from resources.movie import movies
    
    app = Flask(__name__)
    
    app.config['MONGODB_SETTINGS'] = {
     'host': 'mongodb://localhost/movie-bag'
     }
    
    initialize_db(app)
    +app.register_blueprint(movies)
    
    app.run()
    
    Blueprint를 사용하여 Flask 애플리케이션을 구성했습니다. 그리고 예전보다 훨씬 깔끔해 보입니다.

    Flask-restful을 사용하여 Flask REST API 구조화



    이제 처음부터 기다리던 본론으로 들어가 보겠습니다.

    flask-restful 설치

    pipenv install flask-restful
    

    이제 movie.py를 사용하도록 flask-restful 업데이트해 보겠습니다.

    #~movie-bag/resources/movie.py
    
    -from flask import Blueprint, Response, request
    +from flask import Response, request
     from database.models import Movie
    +from flask_restful import Resource
    +
    -movies = Blueprint('movies', __name__)
    +class MoviesApi(Resource):
    +  def get(self):
    +    movies = Movie.objects().to_json()
    +    return Response(movies, mimetype="application/json", status=200)
    +
    +  def post(self):
    +    body = request.get_json()
    +    movie = Movie(**body).save()
    +    id = movie.id
    +    return {'id': str(id)}, 200
    + 
    +class MovieApi(Resource):
    +  def put(self, id):
    +    body = request.get_json()
    +    Movie.objects.get(id=id).update(**body)
    +    return '', 200
    + 
    +  def delete(self, id):
    +    movie = Movie.objects.get(id=id).delete()
    +    return '', 200
    +
    +  def get(self, id):
    +    movies = Movie.objects.get(id=id).to_json()
    +    return Response(movies, mimetype="application/json", status=200)
    +
    [email protected]('/')
    -def get_movies():
    - movies = Movie.objects().to_json()
    - return Response(movies, mimetype="application/json", status=200)
    -
    [email protected]('/', methods=['POST'])
    -def add_movie():
    - body = request.get_json()
    - movie = Movie(**body).save()
    - id = movie.id
    - return {'id': str(id)}, 200
    -
    [email protected]('/<id>', methods=['PUT'])
    -def update_movie(id):
    - body = request.get_json()
    - Movie.objects.get(id=id).update(**body)
    - return '', 200
    -
    [email protected]('/<id>', methods=['DELETE'])
    -def delete_movie(id):
    - movie = Movie.objects.get(id=id).delete()
    - return '', 200
    -
    [email protected]('/<id>')
    -def get_movie(id):
    - movies = Movie.objects.get(id=id).to_json()
    - return Response(movies, mimetype="application/json", status=200)
    
    

    우리가 볼 수 있듯이 flask-restful는 클래스 기반 구문을 사용하므로 리소스(즉, API)를 정의하려면 flask-restfulResource

    +class MoviesApi(Resource):
    + def get(self):
    + movies = Movie.objects().to_json()
    + return Response(movies, mimetype="application/json", status=200)
    

    이것은 GET 요청을 수락하는 끝점을 만듭니다.

    이제 방금 만든 엔드포인트를 등록해 보겠습니다.routes.py 디렉토리 안에 새 파일resources을 생성하고 다음을 추가해 봅시다.

    #~movie-bag/resources/routes.py
    
    from .movie import MoviesApi, MovieApi
    
    def initialize_routes(api):
     api.add_resource(MoviesApi, '/movies')
     api.add_resource(MovieApi, '/movies/<id>')
    

    경로를 초기화하는 함수를 정의했습니다. app.py에서 이 함수를 호출해 보겠습니다.

    #~/movie-bag/app.py
    
    -from resources.movie import movies
    +from flask_restful import Api
    +from resources.routes import initialize_routes
    
     app = Flask(__name__)
    +api = Api(app)
    
     app.config['MONGODB_SETTINGS'] = {
     'host': 'mongodb://localhost/movie-bag'
     }
    
     initialize_db(app)
    -app.register_blueprint(movies)
    -
    +initialize_routes(api)
    
     app.run()
    
    

    여기서 우리는 먼저 Apiapp = Api(app) 인스턴스를 생성한 다음 initialize_routes(api)로 API 경로를 초기화했습니다.

    우와! 우리가 해냈습니다. 이제 http://localhost:5000/movies 에서 영화에 액세스할 수 있습니다. URL만 보면 알 수 있듯이 이것이 API인지 알 수 없습니다. 따라서 API 경로 앞에 routes.py를 추가하도록 api/를 업데이트하겠습니다.

    #~movie-bag/resources/routes.py
    - api.add_resource(MoviesApi, '/movies')
    - api.add_resource(MovieApi, '/movies/<id>')
    + api.add_resource(MoviesApi, '/api/movies')
    + api.add_resource(MovieApi, '/api/movies/<id>')
    

    이제 http://localhost:5000/api/movies 에서 영화에 액세스할 수 있습니다.

    이 부분의 전체 코드를 찾을 수 있습니다here.

    시리즈의 이 부분에서 무엇을 배웠습니까?


  • Blueprint를 사용하여 Flask 앱을 ​​구성하는 방법
  • 다음을 사용하여 REST API를 만드는 방법Flask-restful



  • 다음 파트에서는 ​​REST API에서 AuthenticationAuthorization를 구현하는 방법을 배울 것입니다.

    그때까지 해피코딩 😊

    좋은 웹페이지 즐겨찾기