Open Jaymel opened 2 years ago
자세한 정리 감사합니다👍 Flask2.0에선 flask_apispec 쓰려면 패키지의 내용을 변경해야 사용 가능한 걸로 이해했는데 그렇다면 Flasgger을 쓰는 걸 권장하는 바인 건가요~?
자세한 정리 감사합니다+1 Flask2.0에선 flask_apispec 쓰려면 패키지의 내용을 변경해야 사용 가능한 걸로 이해했는데 그렇다면 Flasgger을 쓰는 걸 권장하는 바인 건가요~?
패키지 수정 없이 기존에 main.__init__.py에서 docs.register_existing_resources() 로 쓰고 있는 부분을 본문 코드로 바꿔도 동작합니다! 일괄적으로 register하는 부분에 문제가 있던 거라 수동으로 하나하나 register한다고 생각하시면 됩니다.
패키지 수정 없이 기존에 main.init.py에서 docs.register_existing_resources() 로 쓰고 있는 부분을 본문 코드로 바꿔도 동작합니다! 일괄적으로 register하는 부분에 문제가 있던 거라 수동으로 하나하나 register한다고 생각하시면 됩니다.
오호 그런 것이군요! 설명 감사합니다 :)
내용
Flask 2.0.x에서의 변경 사항을 간략히 설명합니다. flask_apispec은 현재 Flask 2.0.x에서 사용할 수 없습니다. 대안책 혹은 해결방안을 탐색합니다.
Flask 2.0.0의 변경사항
주요 변경사항
changes document
더이상 Python2와 Python3.5를 지원하지 않습니다.
Werkzeug >= 2, Jinja2 >= 3, MarkupSafe >= 2, ItsDangerous >= 2, Click >= 8로 의존성이 변경되었습니다. 단 Celery 등 Click에 의존성이 높은 applications들을 위해 2.0.x는 Click7 역시 지원합니다. 추후 Flask 2.1.x부터 Click8이 강제될 수 있습니다.
simplejson은 더이상 사용하지 않습니다. built-in json module의 성능이 더 좋아졌으므로 built-in json module을 사용합니다. 단 JSONMixin은 override가 가능하므로 다음과 같은 방법으로 simplejson을 다시 사용할 수 있습니다. 참조
app.json_encoder = JSONEncoder
app.config.from_file(filename: str, loads_function)
@app.post("/blah")
@app.route("/blah", methods=[POST])
""" This examples uses FlaskRESTful Resource It works also with swag_from, schemas and spec_dict
parameters:
상기 등의 이유로 flask_apispec에 비하면 불만족스럽습니다. 사용하기 힘들 것 같습니다.
flask_apispec으로 Flask 2.0.x에 대비하기
현재 상기와 같이 swagger docs에 api를 등록하고 있는 과정을
위의 for 구문으로 변경합니다.
Flask 2.0.x 사용시 기존에 flask_apispec에서 문제가 되던 부분은 다음과 같습니다.
register_exsiting_resources는 blueprint rule들을 swagger에 등록할 때 app.view_functions.items()를 통해 모든 view_function들을 가져와 등록합니다. 이때 flask_apispec.extension.FlaskApiSpec object의 bound method들과 Flask의 send_static_file object의 bound method인 static이 view_function에 포함되는데 apispec에서 swagger ui를 생성할 때 사용하지 않으므로 Type check를 통해 blueprint들만 register합니다. 다만 Flask 2.0.x부터 Flask send_static_file의 static이 lambda func로 생성되며 문제가 발생했습니다.
실제 Flask app의 source를 보면 view_func가 lambda인 걸 볼 수 있습니다. 참조 lambda 역시 types.FunctionType이므로 기존에 bound mehtod들을 예외처리하던 조건문을 통과하고 lambda를 register할 수 없던 flask_apispec은 알 수 없는 에러를 호출하며 사용할 수 없게 됐습니다!
따라서 view_func의 name이 "\<lambda>"인 경우도 예외처리를 해주어야 Flask 2.0.x에서 flask_apispec을 무사히 사용할 수 있습니다!
Flask 2.0.0을 사용 가능한 Repository
현재 CLUE-CDN, CLUE-API, CLUE-Login, punchbox-api 모두 Flask 2.0.0을 사용할 수 있음을 확인했습니다.
참조
Flask 2.0.0 Document post - Everything new in Flask 2.0 flasgger flask_apispec