Flask Rest API -파트:2- Blueprint 및 Flask-restful로 더 나은 구조
파트 2: Blueprint 및 Flask-restful을 사용한 더 나은 구조
안녕! 이전 시리즈에서
Mongoengine
를 사용하여 영화 데이터를 MongoDB 데이터베이스에 저장하는 방법을 배웠습니다. 이제 좀 더 유지 관리 가능한 방식으로 플라스크 응용 프로그램을 구성하는 방법을 알아보겠습니다.이 부분부터 시작했다면 지금까지 작성한 모든 코드를 찾을 수 있습니다here.
플라스크 애플리케이션을 구성하는 두 가지 방법을 배울 것입니다.
참고:
Blueprint
및 Flask-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__)
인수
name
및 import_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-restful
의 Resource
즉+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()
여기서 우리는 먼저
Api
로 app = 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 앱을 구성하는 방법Flask-restful
다음 파트에서는 REST API에서
Authentication
및 Authorization
를 구현하는 방법을 배울 것입니다.그때까지 해피코딩 😊
Reference
이 문제에 관하여(Flask Rest API -파트:2- Blueprint 및 Flask-restful로 더 나은 구조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/paurakhsharma/flask-rest-api-part-2-better-structure-with-blueprint-and-flask-restful-2n93텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)