ASH84
Software Engineer focused on turning complexity into simplicity. Co-founder at Payhere. Previously Tech Lead of remit team at Banksalad.
Experience
- Head of tech Payhere.Inc, 2024โpresent
- CTO Payhere.Inc, 2020โ2023
- TechLead, Banksalad, 2018โ2020
- Senior Software Engineer Danal, 2014โ2018
Latest Blog Posts
-
Sep 10, 2018flask ํ์ผ์ ๋ก๋ ๊ฒ์ฆํ๊ธฐํ์ผ ์ ๋ก๋์ ๊ฒฝ์ฐ ์ฃผ์ํ ์ ์ด(์ ๋ก๋๋ฅผ ๋นํ๋ ์ ์ฅ์์) ์ ์ฑํ์ผ ํน์ ์์น ์๋ ํ์ผ๋ค์ด ๋ค์ด์ฌ ์ ์์์ ํญ์ ์ธ์งํด์ผํ๋ค. ๊ทธ๋์ ์ ๋งํ๋ฉด ํ์ผ ์ ๋ก๋๋ฅผ ์ ์๋ง๋ค๊ฑฐ๋ ๋ด๋ถ์์ ๋ช๋ช ์ ์ธ๊ฐ๋ ์ฌ์ฉ์๋ง ๋ฐ๋ก ์ ๋ก๋ ๋ฉ๋ด๋ฅผ ๋ณด์ด๊ฒ ํด์ ์ ๊ณตํ๊ฑฐ๋ ํ๋ ์์ผ๋ก ํ๊ณค ํ์๋ค. ๊ทธ๋๋ ์ ๋ก๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ ํ ์ ์๋ค. - ํ์ผ ํ์ฅ์ ์ฒดํฌ - ์ฌ์ด์ฆ ์ฒดํฌ - mime type ์ฒดํฌ ๊ทธ๋ ์ง๋ง, **ํ์ผ ํ์ฅ์๋ ์ธ์ ๋ ๋ณ๊ฒฝ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ํํ๋ค.** ์๋ฅผ ๋ค์ด, ์ ์ฑ ์๋ฐ์คํฌ๋ฆฝํธ, ์น์ ๊ฐ์ ํ์ผ๋ค์...
-
Jan 29, 2018flask-mqtt : subscribe ์ qos ์ค์ ์ด์ ์์ ํ๊ธฐ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ฃผ๋ฌธ๊ด๋ จ ๋ถ๋ถ์ ๊ธฐ์กด์ ํด๋ง(polling) ์ ํ๋ ๋ฐฉ์์์ ์ค๊ฐ์ ๋ธ๋ก์ปค์๋ฒ๋ฅผ ๋๊ณ ์ฃผ๋ฌธํ๋ ์ชฝ์์ ์ฃผ๋ฌธ์ ๋ณด๋ด๋ฉด ๋ธ๋ก์ปค ์๋ฒ์ ํน์ topic ์ ๊ตฌ๋ ํ๊ณ ์๋ ๊ตฌ๋ ์๊ฐ ํด๋น ์ฃผ๋ฌธ์ ๋ฐ๋ ํํ๋ก ๊ตฌ์ฑ์ ํ๋ค. ๊ทธ ๊ณผ์ ์์ mqtt ๋ฅผ ์ด์ฉํ๊ณ , [emqtt](https://emqtt.io) ๋ธ๋ก์ปค ์๋ฒ๋ฅผ ์ ํํด์ ์ฌ์ฉํ๊ณ ์๋ค. ์ฃผ๋ฌธ์ ํ๋ ์ชฝ์์๋ flask ๋ก ๊ตฌ์ฑ๋์ด ์์ด์ ๋ณ๋์ [paho client](https://pypi.python.org/pypi/paho-mqtt/1.2) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋...
-
Jan 09, 2018jinja - {% break %} ์ฌ์ฉํ๊ธฐjinja template ๋ ๊ฐ๋ ฅํ ํํ์ for ๋ฌธ์ ์ ๊ณตํ๋๋ฐ, ๋น์ฐํ ์ผ๋ฐ์ ์ธ for ๋ฌธ ์์์์ continue ๋ break ๋ฑ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ง๋ ์๋๋ค. ์ด๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ํ๊ธฐ ์ํด์๋ `jinja2.ext.loopcontrols` ์ ์ค์นํด์ผ ํ๋ค. flask ์์ ์ค์น ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด app ๊ฐ์ฒด๋ด์์ `jinja_env.add_extension` ํจ์์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค. ```python app.jinja_env.add_extension('jinja2.e...
-
Oct 26, 2017beaker_session MySQL server has gone away๋งค์ผ ์์นจ ์์ ํ์ฌ ๊ฐ๋ฐ์ค์ธ ๋ฐฑ์คํผ์ค๋ฅผ ์ผ๋ฉด Internal Server Error ๋ฐ์. ๋ก๊ทธ๋ฅผ ๋ณด๋ ์๋์ ๊ฐ์ ์ค๋ฅ ๋ฐ์ ``` OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (error(32, 'Broken pipe'))") [SQL: u'SELECT beaker_cache.data \\nFROM beaker_cache \\nWHERE beaker_cache.namespace = %(namespace_1)s'] [pa...
-
Oct 25, 2017flask-babel ๋ก ๋ค๊ตญ์ด ๋์ํ๊ธฐflask ๋ก ๋ค๊ตญ์ด ์๋น์ค๋ฅผ ๋ง๋๋ ์ผ์ ํ๊ณ ์๋๋ฐ ์ผ๋จ ์๊ฐํด ๋ณผ ๋ถ๋ถ์ด API ์ WEB ์ด๋ค. API๋ ๋ชจ๋ฐ์ผ์์ ์์ฒญ์ด ๋ค์ด์ค๋ ํํ์ธ๋ฐ, ์ด ๊ฒฝ์ฐ ๋ชจ๋ฐ์ผ์ ์ฌ์ฉ์ ์ธ์ด ์ค์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ณ API ๋ ๋ฒจ์์ DB ๋ด์ ๋ค๊ตญ์ด ์ปฌ๋ผ ํน์ ํ์ด ์๋ค๋ ๊ฐ์ ํ์ select ๋ฅผ ํด์ response ๋ฅผ ๋ด๋ณด๋ด๋ฉด ๋๋ค. WEB ์ ๊ฒฝ์ฐ AcceptLanguage ๋ฅผ ์ด์ฉํ ์๋ ์๊ณ , GET ์์ฒญ์ ํ๋ผ๋ฏธํฐ๋ก ์ธ์ด์ฝ๋๊ฐ ์ ๋ฌ ๋๋ค๋ฉด ๊ทธ๊ฒ์ ํ์ฉํ ์๋ ์๋ค. ์ผ๋จ ์ฌ๊ธฐ์๋ WEB ์์์ ์ธ์ด๋ณ๋ก ์ฌ์ ์ ๋ง๋ค๊ณ jinja ํ ...
-
Sep 06, 2017flask-sqlalchemy multiple databases### **์ฌ์ฉํ๊ธฐ** flask-sqlalchemy ์์ ๊ธฐ๋ณธ์ ์ผ๋ก `SQLALCHEMY_DATABASE_URI` ์ค์ ์ ํตํด์ mapping class ์ ์ ์๋ ํ ์ด๋ธ๋ค์ด DB์ ์ฐ๊ฒฐ๋๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ 1๊ฐ ์ด์์ DB์ ์ฐ๊ฒฐํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ๊ธฐ์กด์ ํ์์ ๋ณด๋ฅผ ๊ฐ์ด ์ฐ๋ ๋ค๋ฅธ ์๋น์ค์ ๊ฒฝ์ฐ๊ฐ ๋ํ์ ์ธ ์ผ์ด์ค์ด๋ค. ์ด๋ด๊ฒฝ์ฐ, flask-sqlalchemy ์์๋ `SQLALCHEMY_BINDS` ๋ฅผ ํตํด์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค URI๋ฅผ ์ง์ ํ ์ ์๊ฒ ํด์ฃผ๊ณ ์๋ค. ```python app.config['SQLALCH...
-
Aug 04, 2017flask - request.script_root ์ด์ฉํ๊ธฐํ๋์ ์น์ ์ฌ๋ฌ path ์ ์ฌ๋ ค์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค๋ฉด, ํ ์คํธ๋ฅผ ์ํด์ `/web1`, `/web2` ์ด๋ฐ์์ผ๋ก ๊ตฌ์ฑํด์ ์ฌ๋ฆด ๊ฒฝ์ฐ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํ๋ก ํธ๋จ์์ URL๋ก ์ง์ ํด ๋์ ๊ฐ๋ค์ ์์ ํด ์ค์ผ ํ๋ค. ajax ๋ฅผ ํธ์ถํ๋ค๊ณ ์๊ฐํด ๋ณด์. ์๋ `/web/api/room` ์ด๋ฐ์์ผ๋ก ajax ๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค๋ฉด `/web1`, `/web2` ์ ๋ฐ๋ผ์ `/web1/api/room`, `/web2/api/room` ์ด๋ ๊ฒ ๋ณ๊ฒฝํด ์ค์ผ ํ๋ค. ```javascript $.ajax({ url: "...
-
Jul 20, 2017flask - render_template ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น?flask ๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด view ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ๊ทธ ์ค ํ๋๊ฐ views.py ์ route ํจ์๊ฐ ๋ง์์ ธ์ ๊ธธ์ด์ง๋๊ฒ ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ๋๋ `render_template()` ํจ์์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ง์์ ธ์ ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ๋ค. ์ ์์ ๊ฒฝ์ฐ blueprint ๋ก ๋ถํ ํ๊ฑฐ๋ resource ๋จ์๋ก ๋ถํ ํ๋ฉด ํด๊ฒฐํ ์ ์๋ค. (์ด๊ฑด ๋ค๋ฅธ ํฌ์คํธ์์ ์์ธํ ์ค๋ช ํ๊ฒ ๋ค.) ํ์์ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ์ ์์๊น? ๋ญ ์ด๋ฐ์์ผ๋ก ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ๋ค. ```python return render_template('web.html'...
-
Jun 15, 2017flask - json_encoder ์ง์ ํ๊ธฐAPI ์์์ JSON ์ผ๋ก ์๋ต์ ๋ด๋ณด๋ด๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ Json Serialize(์ง๋ ฌํ)๋ฅผ ํด์ผํ๋ค. ๊ทธ๋ฐ๋ฐ json ์์ ํํํ ์ ์๋ ๋ฐ์ดํฐ๋ ํ์ ์ด ๋์ด ์์ด์ ๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์๋ ๋ชจ๋ ํ์ ์ ์ง์ํ์ง๋ ๋ชปํ๋ค. Decimal ํ๋ ๊ทธ๋ฐ ์ ์ค ํ๋์ธ๋ฐ ํ์ด์ฌ์์๋ `json.dumps()`๋ฅผ ํตํด์ ์ฃผ๋ก ์ง๋ ฌํ๋ฅผ ํ๊ณ ๊ทธ ํจ์์ ๊ธฐ๋ฅ ์ค์ `cls` ์ธ์๋ฅผ ํตํด์ JSONEncoder ๋ฅผ ๊ตฌํํ ์๋ธ ํด๋์ค๋ฅผ ์ง์ ํด ์ฃผ๋ฉด ํด๋น ์ธ์ฝ๋๋ก json ๋ฌธ์์ด์ ๋ง๋ ๋ค. flask ์์๋ `json.dumps` ...
-
May 22, 2017Security bugs on Windows servers: Flask 0.12.2 and Werkzeug 0.12.2 released์๋ฌธ : https://www.palletsprojects.com/blog/flask-werkzeug-0122-security-release/ Flask 0.12.2, Werkzeug 0.12.2 ๊ฐ ๋ฆด๋ฆฌ์ฆ ๋์๋๋ฐ ์ด๊ฒ๋ค์ `safe_join` ํจ์์ ๋ํ ๋ณด์๊ด๋ จ ๋ฒ๊ทธ์์ ์ ํฌํจํ๊ณ ์๋ค. ์ด ๋ฌธ์ ๋ Windows ์๋ฒ์์ application ์ ์ด์์์ ๋ฐ์ํ๋ค. ###Details [David Lord](https://twitter.com/davidism)๊ฐ ์ด ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ๊ฐ์ธ ์ด๋ฉ์ผ๋ก ๋ค๋ฅธ ๊ด๋ฆฌ์์๊ฒ ์๋ ธ...
-
Apr 03, 2017flask - jinja2 tojson ํํฐflask ๋ฌธ์๋ฅผ ๋ณด๋ค๋ณด๋ [standard filters](http://flask.pocoo.org/docs/0.12/templating/#standard-filters) ๋ผ๋ ํญ๋ชฉ์ด ์๋๋ฐ `tojson` ์ด ๊ทธ ๋ด์ฉ์ด๋ค.(๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ํํฐ๋ผ๋ ๋ด์ฉ) ๊ฐ๋ตํ๊ฒ ์ ๊ธฐํ์๋ฉด, ์ด๋ค ๋๋๋งํ ๋ณ์์ `tojson` ์ด๋ผ๊ณ jinja2 ํ ํ๋ฆฟ ์์์ `|` ๋ฅผ ์ด์ฉํด์ ๋ถ์ด๊ฒ ๋๋ฉด json์ผ๋ก ๋ณํ๋ ๊ฐ์ ๋๋๋งํด์ค๋ค. ์๋ฅผ๋ค์ด, user ๋ผ๋ dict ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์ ๋ฌํ๋ค๊ณ ํ ๋, ```python @a...
-
Dec 06, 2016(flask) JSON ๋ฐ์ดํฐ ๋ฐ๊ธฐ ๋ฐ ์์ธ์ฒ๋ฆฌflask ์์ json ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ๋ reqeust.get_json() ํน์ request.json ์ ์ด์ฉํ ์ ์๋๋ฐ, mime type์ application/json ํ์ ์ผ๋ก ๋ณด๋ด๋๋ฐ, {} ์์ด ๋น JSON ๋ฌธ์์ด ์กฐ์ฐจ๋ ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ๊ฐ ์์์๊ฐ ์๋ค. ```python from flask import Flask from flask import request app = Flask(__name__) @app.route("/test", methods=['POST']) def test(): pri...
-
Nov 18, 2016(flask) jsonschema ๋ฅผ ์ด์ฉํด์ request.json ๊ฒ์ฌํ๊ธฐAPI์์ ํ๋ผ๋ฏธํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ ํ์์ ์ธ ์์์ด๊ธด ํ์ง๋ง, ๊ฐ๋ฐ์๋ก์ ์ฌ๊ฐ ๊ท์ฐฎ์ ์ผ์ด ์๋ ์ ์๋ค. API์ ์์ด ๋ง์์๋ก ํ ์ผ์ ๋ง์์ง๋ค. ์ธ์ธํ๊ฒ ์ฒดํฌํ ๋ถ๋ถ์ ํด์ผํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ ์ ๋ฌด, ํ๋ผ๋ฏธํฐ์ ๋ฐ์ดํฐ ํ์ ์ฒดํฌํ๋ ๋ถ๋ถ์ด ํ์ํ๋ค. API๋ ๊ธฐ๋ณธ์ ์ผ๋ก JSON ์ `POST`๋ก ๋ฐ๋ ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ด์ JSON์ ๊ฒ์ฆํ๋ ๋ถ๋ถ์ด ํ์ํ๋ค. JSON ๊ฒ์ฆ์ ์ํด์ [jsonschema](https://pypi.python.org/pypi/jsonschema) ๋ฅผ ํ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์์๋๋ฐ, ๋ฌธ...
-
Aug 03, 2016flask-runnerFlask ์์ ๊ฐ๋ฐ์ ํ ๋, Debug ์ต์ ์ ํค๊ณ app ์ ๊ธฐ๋ณธ ๋ด์ฅ๋ ๊ฐ๋ฐ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ํ์ผ์ ์์ ํ๋ฉด ์ฌ์์ํ๋ ๊ธฐ๋ฅ์ ์ข์๋ฐ, `host` ๋ `port` ๋ฅผ ์ง์ ํด ๋๊ณ ์ฌ์ฉํ๋ค๊ฐ ๋ณ๊ฒฝํ ๋ ๊ท์ฐฎ์ ๋ถ๋ถ์ด ์๋ค. ํนํ `port` ๊ฐ์ ๊ฒฝ์ฐ ํน์ ํฌํธ๋ฅผ ์ง์ ํด๋๋ฉด ๊ผญ ๋ค์๋ ์ ๋๊ตฐ๊ฐ ์ฐ๊ณ ์์ด์ ๋ค์ ์์ ํด์ ์คํํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค. [flask-runner](https://github.com/miguelgrinberg/Flask-Runner) ๋ ์ปค๋งจ๋๋ผ์ธ์ผ๋ก Flask ์ฑ์ ์คํํ ๋ ์ต์ ๋ค์ ์ค...
-
Jul 16, 2015euc-kr data in flask### **ํ์ด์ฌ์์์ unicode์ str** - ์ ๋์ฝ๋๋ ํ๋ฌธ์ด๊ณ , str์ ์ํธํ๋ ์ ๋์ฝ๋๋ผ๊ณ ์๊ฐํ์. - charset ์ str ์ ๋ง๋ค๊ธฐ ์ํ ํค์ด๋ค. ์ฆ, unicode ์์ str ์ ๋ง๋ค๋ ค๋ฉด charset์ด ํ์ํ๊ณ , str์์ unicode ๋ฅผ ๋ง๋ค๋ ค๋ฉด charset์ด ํ์ํ๋ค. [![image2015-6-25 16 29 58](https://farm1.staticflickr.com/353/19544431756_5af01e9694_z.jpg...
-
Jul 06, 2015jinja template - extend block ์ด์ฉํ๊ธฐ๊ธฐ์กด์๋ `{%include "head.html" %}` ์ด๋ฐ์์ผ๋ก html ๋ด ํน์ ๋ถ๋ถ, ์ฆ ์์ฃผ ์ฌ์ฉํ๋ ๋ถ๋ถ์ ๋ชจ๋ ํ์ด์ง์ ๋ถ์ฌ์, `include` ์ง์์๋ฅผ ์ด์ฉํด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ์ฌ์ฉํด ์์๋ค. ์์ ํ๋ก์ ํธ์์๋ head.html ์ ๋ฐ๋ก ๋๊ณ ๊ทธ ์์์ css ๋ฐ ๊ธฐํ `` ๋ถ๋ถ์ ๋ค์ด๊ฐ๋ ์ฝ๋๋ฅผ ์์ฑํด์ ์ฌํ์ฉ ํ์๋ค. ๊ทธ๋ฐ๋ฐ ์ต๊ทผ์ body ์์ navigation bar ์ footer (์๋จ, ํ๋จ)๋ง ๋๊ณ ๊ฐ์ด๋ฐ์ ์ปจํ ์ธ ๋ถ๋ถ๋ง ์๋จ ํน์ ํ๋จ์ ๋งํฌ์ ๋ฐ๋ผ์ ๋ฐ๊ฟ์ ๋ณด์ฌ์ค์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์์๋๋ฐ ์...
-
Mar 31, 2015heroku์์ flask ์ฌ๋ฆฌ๊ธฐheroku ๋ฅผ ์์ฃผ ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด ๋ง์น ์๋ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋๊ฒ ์ฒ๋ผ ์น์ ๊ณต๊ฐ์ ๋ํํด์ฃผ๋ ์ ์ฒด์ธ๋ฐ, ํด๋ผ์ฐ๋ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ซํผ์ด๋ผ๊ณ ํ๋ค.ย ํน์ดํ๊ฒ git ์ํตํด์ ์ฌ๋ฆฌ๊ณ ๋ด๋ฆฌ๊ณ ํจ์ผ๋ก์จ ์์ค๋ฅผ ์๋ฒ์ ๋ฐ์ํ ์ ๊ฐ ์๋ค. heroku ์์๋ python ๋ถ๋ถ์ ๊ธฐ๋ณธ์ ์ผ๋ก django๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ ์๋๋ฐ **[heroku์์ ์ ๊ณตํ๋ flask ๊ฐ์ด๋](https://devcenter.heroku.com/articles/getting-started-with-python-o)**๋ฅผย ๊ธฐ๋ณธ์ผ๋ก ํด์ ์ค๋ช ํ๊ฒ ๋ค.ย ๊ฐ์ ์ ํ...
-
Mar 10, 2015uwsgi ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ### ๊ฐ์ - WAS ์๋ฒ์ ์ผ์ข , ํ์ฌ ํ์ด์ฌ ์๋ฒ ์ค ๊ฐ์ฅ ์ข์ ์ฑ๋ฅ์ผ๋ก ์๋ ค์ ธ ์๋ค.ย - ์ดํ๋ฆฌ์ผ์ด์ ์ปจํ ์ด๋๋ก ํ์ด์ฌ์ผ๋ก ๋ง๋ ์ฑ์ ์คํํด ์ฃผ๋ ์ญํ , WSGI ์ ์ง์ํ๋ค.ย #### ์ค์น ```bash $ pip install uwsgi ``` #### flask ์ ์ฐ๋ ```bash uwsgi โhttp 127.0.0.1:3031 โwsgi-file ./myflaskapp.py โcallable app โprocesses 4 โthreads 2 โstats 127.0.0.1:9191 ```` ...
-
Mar 06, 2015jinja template for ๋ฌธ์์ index ๊ฐ์ ธ์ค๊ธฐ๋ณดํต jinja template ์์ for ๋ฌธ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ์ด๋ค ๋ฆฌ์คํธ ๋ด์ ์์ดํ ์ ํ์ํ๊ฒ ๋๊ณ ๋ฆฌ์คํธ๋ด์ ์์ดํ ์ ์ง์ ๊ฐ์ ธ์ค๋๋ฐ index๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์๋ฅผ๋ค๋ฉด ํน์ index ๋ง ๊ฑด๋๋ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ๊ทธ๋ด๊ฒฝ์ฐ๋ `loop.index` ๋ก ์ ๊ทผํด์ index๋ฅผ ๊ฐ์ ธ์ฌ์ ์๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ์ฝ๋ค.ย ...
-
Jan 30, 2015python response data for flaskflask ๋ก ์์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋๊ฐ์ง์ธ๋ฐ, view ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์๋๋ฉด json ํํ๋ก api ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ค๊ฑฐ๋. ๊ทธ๋ฐ๋ฐ ์ฒซ๋ฒ์จฐ๋ ๋จธ `render_template` ์ฌ์ฉํ๋ ๊ฑฐ๊ณ , ๋๋ฒ์งธ api ๊ฒฐ๊ณผ์ ๊ฒฝ์ฐ ๋ณดํต ๊ณตํต์ ์ธ api ๊ฒฐ๊ณผ ํ์/ํฌ๋งท์ ๋ง๋ค์ด์ ๋ฐํํ๊ธฐ ๋ง๋ จ์ด๋ค. ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ด ์๊ฒ ์ง๋ง, ์ ํธํ๋ ๋ฐฉ์์ meta ์ data ๋ก ๋๋๋ ๊ฒ์ธ๋ฐ meta ์๋ code ๊ฐ ๋ค์ด๊ฐ๋๋ฐ http status code ํน์ ํ์ฅํ ๊ฒฝ์ฐ ํ์ฅ์ฝ๋๊ฐ ๋ค์ด๊ฐ๊ณ message ๋ ๋ณดํต ์๋ฌ์ ๊ฒฝ์ฐ ์์ธ ์๋ฌ๋ฉ์์ง๊ฐ ๋ค์ด...
-
Dec 18, 2014flask logger decorator(๋ฐ์ฝ๋ ์ดํฐ)์ ํจ๊ป ์ฌ์ฉํ๊ธฐ###๊ธฐ๋ณธ๋ก๊ทธ ์ธํ ํ๊ธฐ### ๋ก๊ทธ์ ๋ํ ๋ถ๋ถ์ด ๋ ๊ฑฑ์ ์ด๊ธด ํ๋ฐ, ์ฌ์ค ๋ฐ๋ก python logger ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ๋ ๋จ๊ธฐ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๋ง๋๋ ํ๋ก์ ํธ ๋ง๋ค ๋ถ์ฌ์ ์ฌ์ฉํ๋ ์์ผ๋ก ํ์๋๋ฐย ์ด๋ฒ์ flask ์ ์๋ logger ๋ฅผ ์ด์ฉํด ๋ณด๊ธฐ๋ก ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ช๊ฐ์ ํธ๋ค๋ฌ๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.ย - FileHandler ย โ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํ์ผ์ ๋จ๊ธด๋ค.ย - RotatingFileHandler โ ๋ก๊ทธ๋ฉ์์ง๋ฅผ ํ์ผ์ ๋จ๊ธฐ๊ณ , ํน์ ์ ์ด์์ด๋ฉด ๋ค์ํ์ผ๋ก ๋๊ฒจ์ ๋ก๊ทธ๋ฅผ ๋ง๋๋ ํธ๋ค๋ฌ, maxByt...
-
Dec 10, 2014flask HTTP ์๋ฌ ๋ฐ๋ก ๋ฉ์ผ๋ก ๋ฐ๊ธฐ200 OK์ธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด์ ๋ฉ์ผ๋ก ์๋ฌ๋ฅผ ๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๋ฌผ๋ก 500 Server Internal Error ์ ๊ฒฝ์ฐ์๋ ๋ก๊ทธ๋ฅผ ๋ณด๋๊ฒ ์ ์ผ ๋น ๋ฅด์ง๋ง, ์ ๋ ๊ฒ ๋ฉ์ผ๋ก ๋จ๊ธฐ๋ ์ด์ ๋ ์ด๋ค ip ์์ ์๋ชป๋ ์ ๊ทผ์ ํ๋์ง ๋ณด๊ธฐ ์ํด์ ์ด๋ค. ์๋์ ์ฝ๋๋ ๋ณ๋ค๋ฅธ ๋ฉ์ผ ์๋ฒ ์์ด ๋ฆฌ๋ ์ค ์์ฒด์ ์๋ sendmail ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ด์ฉํด์ ํธ์ถํ๋ ์์ค์ด๋ค. ์คํ๋ ค s...
-
Dec 01, 2014flask file download์์ฃผ ๊น๋จน๋์ง๋ผ, ์๋ฒ์ ํ์ผ๋๊ณ ๋จ์ ๋ค์ด๋ก๋์ `send_from_directory` ํจ์ ์ฌ์ฉ. ...
-
Nov 25, 2014[flask] robots.txt, sitemap.xmlstatic ๋๋ ํ ๋ฆฌ์ robots.tx, sitemap.xml ํ์ผ์ด ์๋ค๋ ๊ฐ์ ํ์ ์ฌ์ฉํ๋ฉด ๋๋ค.ย robots.txt ์ ๋ํ ์ค๋ช ์ ์๋์ ๋งํฌ๋ฅผ ์ฐธ์กฐ.ย [ https://support.google.com/webmasters/answer/6062608?hl=ko](https://support.google.com/webmasters/answer/6062608?hl=k...
-
Nov 11, 2013(flask) Pluggable View, Class ์์ ์์ฒญ์ฒ๋ฆฌํ๊ธฐ[Pluggable View](http://flask.pocoo.org/docs/views/?highlight=as_view) ๋ผ๊ณ ๋ง์ด ์ด๋ ค์ด๋ฐ, ๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด flask ๋ ๊ธฐ๋ณธ์ ์ผ๋ก url ๊ณผ ํจ์์ ๋งตํ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ์๋์ย Quick Start ์์๋ ๋ณด๋ฉด ์๊ฒ ์ง๋ง, url โ/ โ ๋ hello_world() ๋ผ๋ ํจ์์ ๋งตํ์ด ๋์ด ์์ด์ / ๋ก ๋ค์ด์ค๊ฒ ๋๋ฉด hello_world() ํจ์๋ก ๋ค์ด์ค๊ฒ ๋๋ค.ย ...
-
Oct 28, 2013(flask) jinja2 {% include %} ํ์ฉ๋๋จํ๊ฑด ์๋๊ณ , flask ๋ ๊ธฐ๋ณธ์ ์ผ๋ก jinja2 ๋ฅผ ํ ํ๋ฆฟ ์ธ์ด๋ก ์ฌ์ฉํ๋๋ฐ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ํ๋์ template์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋์ด ์ง๋ ๋ถ๋ถ์ด ์๋ค. ์๋ฅผ ๋ค๋ฉด, ๊ฐ์ css ๋, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ธ์ค๋ header์ ๋ถ๋ถ์ด๋ ์๋จ์ navigation ๋ถ๋ถ, ํ๋จ์ footer ๋ถ๋ถ์ด ๊ทธ๋ฌํ๋ฐ ์ผ์ผํ ๋ชจ๋ ํ ํ๋ฆฟ์ ๋ฃ์ด ์ฃผ๊ธฐ๋ ๊ท์ฐฎ๋ค. ๊ทธ๋์ jinja2 ์์๋{% ย include %} ๋ฅผ ํตํด์ ํ๋์ html ์์ ๋ค๋ฅธ html ์ ๊ฐ์ ธ์ฌ์ ์๋๋ก ํด์ค๋ค....
-
Oct 23, 2013(flask) tornado ์๋ฒ ์ ์ฉ๋ค๋ค ์์๊ฒ ์ง๋ง flask ๋ด์ฅ ์๋ฒ๋ ๊ตฌ๋ฆฌ๊ณ , ์ฌ์ค ์ด์ฉ๋๋1๋ฒ ์ดํ์ ์ ์์ด ์๋ ๋๋ ๋ง๋ค. ๊ทธ๋์ flask ๋ฌธ์์์๋ ๋ฐฐํฌ์์๋ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ๊ถ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ tornado ์๋ฒ๋ฅผ ๋ถ์ผ์๊ฐ ์๋ค. ์ฌํ์ ๋ค๋ฅธ ์๋ฒ๋ฅผ ๋ถ์ผ์๊ฐ ์๋๋ฐย ๋งํฌ๋ฅผ ํ์ธํ๋ฉด ๋๋ค.ย ์ผ๋จ tornado๋ฅผ ์ค์นํ๋ ๋ฒ์ ์๋์ ๊ฐ๋ค. ๋น์ฐ pip. ...
-
Oct 06, 2013(flask) static ํ์ผ ์ง์ gist ํ๋์ ๋ค ๋ฃ์ด์ ์ค๋ช ํ์๋ฉด, main.py ์์ ๋จผ์ static_folder ๋ฅผ static ์ผ๋ก ์ง์ ํด ์ฃผ๊ณ ์ค์ ํ๋ก์ ํธ ํด๋ ๋ด์ static ์ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ css, js ํด๋๋ฅผ static ํ์์ ๋ง๋ค๊ณ ๊ด๋ จ ํ์ผ๋ค์ ๋ฐฐ์นํ๋ค. ๊ทธ๋ฆฌ๊ณ html ๋ด์์๋ url_for ๋ฅผ ์ด์ฉํด์ ์ง์ ํด ์ฃผ๋ฉด ๋๋ค.ย ...
-
Sep 06, 2013(flask) http get url ์ฒ๋ฆฌ๋น์ฐํ ์ต๊ทผ์๋ ์คํAPI๋ ํน์ ๊ฐ๋จํ๊ฒ ์น ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ํ๋ฉด Http Get ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๋ฐ flask ์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌ ํ ์ ์๋ค. `@app.route()`ํจ์์์ ์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์ง์ ์ ํด์ฃผ๊ณ ๋๋ฉด `request.args.get()` ํจ์๋ฅผ ํตํด์ ํด๋น url ๋ก ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.ย ...
-
Aug 08, 2013(flask) helloworld.pypip install flaskย ย ...