django는 자동으로 폴더구조까지 다 셋팅을 해주기 때문에 개발만 하면 됐었다. (물론 설정하기 나름이지만.)
하지만 flask는 본인이 일일이 다 설정해줘야 한다. 그래서 검색해보면 블로그마다 다 다르다!
아래 구조도 개발하다보면 바뀔 수 있다.
├── app
│ ├── __init__.py
│ ├── config.py
│ └── namespace.py
├── credentials.py
├── endpoint
│ ├── __init__.py
│ └── user
│ ├── endpoint.py
│ ├── model.py
│ └── view.py
├── run.py
필요한 라이브러리 설치
pip install flask, flask-restplus, sqlalchemy, Flask-SQLAlchemy
# -*- coding: utf-8 -*-
from credentials import DATABASE as DB, SECRET_KEY
class Config(object):
SECRET_KEY = SECRET_KEY
DEBUG = False
Testing = False
SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{DB['user']}:{DB['password']}@{DB['host']}:5432/{DB['database']}"
SWAGGER_UI_DOC_EXPANSION = 'full'
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_TRACK_MODIFICATIONS = False
class TestingConfig(Config):
DEBUG = True
TESTING = True
PRESERVE_CONTEXT_ON_EXCEPTION = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
class ProductionConfig(Config):
DEBUG = False
configs = dict(
dev=DevelopmentConfig,
test=TestingConfig,
prod=ProductionConfig
)
# -*- coding: utf-8 -*-
from app import api
class DutchNamespace:
prifix = '/api/v1'
def __init__(self, namespace, description):
api.namespace(self.prifix + namespace, description=description)
# -*- coding: utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restplus import Api
from app.config import configs
class API:
app: Flask = None
db: SQLAlchemy = SQLAlchemy()
def __init__(self, title="", description="", version='1.0', config=None):
self.app = Flask(__name__)
self.app.config.from_object(config)
self.api = Api(self.app, title=title, description=description, version=version)
api = API(version='1.0', title='더치페이', description='Dutch pay simple API', config=configs['dev'])
# -*- coding: utf-8 -*-
from app import api
if __name__ == '__main__':
api.app.run()
flask_restful
REST API를 쉽고 빠르게 구축하는 것을 도와줌
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
flask_restplus
REST API를 쉽고 빠르게 구축하는 것을 도와줌
Swagger UI 지원
from flask import Flask
from flask_restplus import Resource, Api
app = Flask(__name__)
api = Api(app)
@api.route('/hello')
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
if __name__ == '__main__':
app.run(debug=True)
오류
app.run()을 하니 계속해서 아래와 같은 에러가 났다.
찾아보니 flask를 설치하면 같이 설치되는 werkzeug 라이브러리인데, 이것때문에 계속해서 에러가 났다.
하지만 flask_restful을 사용하여 flask application을 만들 때는 정상적으로 잘 실행이 되었는데,
flask_restplus를 사용하여 만드니 이런 에러가 났다.
ImportError: cannot import name 'cached_property' from 'werkzeug'
해결방법
아래와 같이 버전을 다운시켜 다시 설치해줬더니 해결이 됐는데...
pip install Werkzeug==0.16.0
안녕하세요? 저는 파이선 3.9버전을 사용하고 위에 블로그 처럼 버전을 0.16 으로 했는데도 계속 오류가 발생하는데요, python, flask, flask restplus , werkzeug 각각 버전을 좀 알 수 있을가요?
아래와 같이 계속 오류가 발생하네요. 하나 해결하면 다른게 나오고요
cannot import name 'ContextVar' from 'werkzeug.local'