Flask-Large-Application-Example
This is how I structure my large Flask applications.
About
๋ง์ดํฌ๋ก ์น ํ๋ ์์ํฌ์ธ Flask๋ ํญ์ ๊ฐ๋ฐ์์๊ฒ ๊ตฌ์กฐ์ ๋ํ ๊ณ ๋ฏผ์ ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด ์ ์ฅ์๋ ์ ๊ฐ Flask๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ๋ ๊ณ ๋ฑํ๊ต 1ํ๋ ๋๋ถํฐ ์ง๊ธ๊น์ง์ ์๊ฐ๋์ Flask ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ์ ๋ํด ๊ณ ๋ฏผํ ํ์ ์ ๋๋ค. ๊ทผ๋ฐ ๋ญ ๊ณ์ ๊ฐ์ ํ๋ค ๋ณด๋๊น Flask์๊ฒ๋ง ํน๋ณํ ์ ์ฉํ ์ ์๋ ๊ตฌ์กฐ๋ผ๊ธฐ ๋ณด๋จ ๋ค๋ฅธ ์น ํ๋ ์์ํฌ๋ค์์๋ ์จ๋จน์ ์ ์๋ ๊ธฐ๋ฐ์ด ๋ ์๋ ์์ ๊ฒ ๊ฐ๋ค์.
๊ตฌ์กฐ๊ฐ ๋ง ๋นก์ธ๋ค๊ณ ์ข์์ง๋ ๊ฑด ์๋ ๊ฒ ๊ฐ์์, ์กฐ๊ธ ํธํ๋ ค๊ณ ๋ณต์ก๋๋ฅผ ๋์ฌ๋ฒ๋ฆฌ๋ ๋ชจ์ต์ ์ง์ํ์ต๋๋ค. ์ด ๋ ํฌ์ '์ต์ ๋ฒ์ '์ ํญ์ ์ ๊ธฐ์ค์์ ๊ฐ์ฅ ํธํ ๊ตฌ์กฐ์ธ๋ฐ, ๋ชจ๋์๊ฒ ๊ทธ๋ ์ง๋ ์๊ณ ์ ๋ ์์ฃผ ๋ง์์ด ๋ฐ๋๋๋ค. ๋ณ๊ฑฐ ์๋ ์ฝ๋์ ์ปค๋ฐ์ด ๋ฐฑ๋จ์์ธ ๊ฒ ์ด๋ฐ ์ด์ ๋๊น, ๊ทธ๋ฅ ์ด๊ฑฐ ๊ฐ์ ธ๊ฐ์ ๋ณธ์ธํํ ๋ง๊ฒ ์ปค์คํ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋น ใ ใ
์ปจ์
app/__init__.py)
application factory๊ฐ ํ์ํ๋ค.(local์์ ์คํํด๋ณด๋ ์ฉ๋, ํ ์คํธ ํด๋ผ์ด์ธํธ๋ฅผ ์ป๋ ์ฉ๋, ๋ฐฐํฌ ๋จ์์ ์ฌ์ฉํ๋ ์ฉ๋ ๋ฑ์ผ๋ก app ๊ฐ์ฒด๊ฐ ํ์ํ๋ฐ, ๊ทธ๋ค์ ๋ชจ๋ extension ์ด๊ธฐํ - view๋ค ๋ผ์ฐํ - hook ๋ฌ์์ฃผ๋ ๊ฒ์ ๋๊ฐ๊ณ , ๋จ์ง ์ฃผ์ ๋๋ config๊ฐ ๋ค๋ฅธ ๊ฒ๋ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. create_app์์ config class๋ค์ ๋ฐ๋๋ก ํ์ต๋๋ค.
app/extensions.py, app/__init__.py์ register_extensions)
extension๋ค์ lazyํ๊ฒ ์ด๊ธฐํํ๋ค.(์ด๋ค config๋ฅผ ์ฃผ์ ํ ์ง๋ create_app ํจ์๊ฐ ํธ์ถ๋ ํ ์ ํด์ง๋ฏ๋ก, config์ ์ํด ์ด๊ธฐํ๊ฐ ์งํ๋๋ extension๋ค์ lazyํ๊ฒ ์ด๊ธฐํํ๋๋ก ํ์ต๋๋ค.
config/)
config๋ฅผ ๋ฐ๋ก ํจํค์งํํด์, ์ ํ์ง๋ฅผ ๋์ด ๊ด๋ฆฌํ๋ค.(- Flask์์ config๋ class๋ก ๋ค๋ฃจ๋ ๊ฒ ๊ฐ์ฅ ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
- Config๋ ์ ์ ์ด์ด์ผ ํฉ๋๋ค. Config class ๋ด์์ if์ ์ด ์๋ ํํ๋ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๊ฒฝ ๋ณ์์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ config๋ฅผ ์ฃผ์ ํด์ผ ํ๋ค๋ฉด, ๊ฐ๊ฐ์ ๋ง๊ฒ class๋ฅผ ๋๋์ด ์ค๋นํ ํ create_app์ ํธ์ถํ๋ ๋จ์์ config๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ ๋ฌํ๋๋ก ๋ง๋๋ ๊ฒ ์ข๋ค๊ณ ๋ด ๋๋ค.
- ์ ํ์ง๋ง๋ค ๋ชจ๋์ ๋ง๋ค์ด ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Local DB๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ํ๋ config/Remote DB๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ํ๋ config๋ฅผ db_config๋ผ๋ ๋ชจ๋์ LocalDBConfig, RemoteDBConfig ํด๋์ค๋ก ์ค๋นํ๋ค.
constants/)
์์ config๋ ๋ฐ๋ก ๊ด๋ฆฌ๋์ด์ผ ํ๋ค.(DRYํ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ฆฌํฐ๋ด์ ์ง์ํด์ผ ํฉ๋๋ค. ๊ฒ์๊ธ ๋ชฉ๋ก API์์ ๋ฐํํด์ฃผ๋ ๊ฒ์๊ธ ๊ธฐ๋ณธ ๊ฐฏ์๋, ํน์ API์ ์ฌ์ฉ ๊ฐ๋ฅ ์๊ฐ๊ฐ์ ๊ฒ๋ค์ ์๋ก ๋ค ์ ์์ต๋๋ค. ์ด๋ฐ ์์ config๋ค์ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํ๋ ๊ฒ์ ๋ง์ง๋ง, ๊ตณ์ด app ๊ฐ์ฒด์ ์ฃผ์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ๋ชจ๋๋ง ๋ง๋ค์ด ๋๋ฉด ๋จ.
app/views/_init_.py)
blueprint์ flask_restful์ด ํ์ํ๋ค.(๋ค๋ฅธ ๋ณต์กํ ์ด์ ๊ฐ ์๋๋ผ, ๋ ๊ตฌ์กฐ์ ์ธ ๋ผ์ฐํ ์ ์ํด blueprint์ url prefix, flask_restful์ MethodView ํ์ฅ์ด ๋์์ ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
app/context.py)
context-dependentํ ๋ฐ์ดํฐ๋ ๋ฐ๋ก property classํ ์ํจ๋ค.(request, g ์ฒ๋ผ contenxt-dependentํ ๊ฐ์ฒด๋ attribute๊ฐ dynamicํ๊ธฐ ๋๋ฌธ์, known attribute๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๊ณํด์ฃผ๋ ๊ฒ ์ข์ต๋๋ค. ํด๋จผ ์๋ฌ ์๋ฐฉ์ ๋์์ด ๋๋๋ผ๊ตฌ์.
app/hooks/)
request context๋ฅผ hookํ๋ ์น๊ตฌ๋ค์ hook ํจํค์ง์ ๋ฐ๋ก ๊ด๋ฆฌํ๋ค.(app/decorators/)
view function์ด ํธ์ถ๋๊ธฐ ์ ์ ์ ์ฒ๋ฆฌ๋ view decorator๊ฐ ํ๋ ๊ฒ์ด ๋ง๋ค.(I Referred
People
Repository
- https://github.com/imwilsonxu/fbone
- https://github.com/cookiecutter-flask/cookiecutter-flask
- https://github.com/JackStouffer/Flask-Foundation
- https://github.com/alexandre-old/flask-rest-template
- https://github.com/dpgaspar/Flask-AppBuilder
- https://github.com/hack4impact/flask-base
- https://github.com/gothinkster/flask-realworld-example-app
- https://github.com/alexandre-old/flask-rest-template
- https://github.com/JoMingyu/Flask-Large-Application-Example
- https://github.com/yoshiya0503/Hermetica
- https://github.com/realpython/cookiecutter-flask-skeleton
- https://github.com/swaroopch/flask-boilerplate
Website
Explore Flask - Explore Flask 1.0 documentation
Organizing your project - Explore Flask 1.0 documentation
Patterns of Flask - Flask Documentation (0.12)
Larger Applications - Flask Documentation (0.12)
Application Structure | Flask(A Python Microframework)
How To Structure Large Flask Applications | DigitalOcean
How to Structure a Flask Application
Flask Large App How to - GitBook
Flask Project ๊ตฌ์กฐ ์์ - /usr/lib/libsora.so
StackOverflow - Common folder/file structure in Flask app