Flask 초기셋팅

Nam Eun-Ji·2020년 11월 28일
0

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





app/config.py

# -*- 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
)

app/namespace.py

# -*- coding: utf-8 -*-
from app import api

class DutchNamespace:
    prifix = '/api/v1'

    def __init__(self, namespace, description):
        api.namespace(self.prifix + namespace, description=description)

app/__init__.py

# -*- 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'])

run.py

# -*- coding: utf-8 -*-
from app import api

if __name__ == '__main__':
    api.app.run()





flask_restful vs flask_restplus

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
profile
한 줄 소개가 자연스러워지는 그날까지

1개의 댓글

comment-user-thumbnail
2021년 7월 18일

안녕하세요? 저는 파이선 3.9버전을 사용하고 위에 블로그 처럼 버전을 0.16 으로 했는데도 계속 오류가 발생하는데요, python, flask, flask restplus , werkzeug 각각 버전을 좀 알 수 있을가요?
아래와 같이 계속 오류가 발생하네요. 하나 해결하면 다른게 나오고요
cannot import name 'ContextVar' from 'werkzeug.local'

답글 달기