#flask1.0
Explore tagged Tumblr posts
Text
Flask 1.0 Changelog ์ฐ๋ฆฌ๋ง ๋ฒ์ญ
๋๋์ด Flask 1.0์ด ์ถ์๋์๋ค์ :) http://flask.pocoo.org/docs/1.0/changelog/ ๋ฅผ ์ฐ๋ฆฌ๋ง๋ก ๋ฒ์ญํด๋ดค์ต๋๋ค. ์์ญ, ์ค์ญ ๋ง์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ก๋ง ๋ด์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค.
Flask 1.0 Changelog
Python 2.6๊ณผ 3.3 ์ง์์ด ์ค๋จ๋์์ต๋๋ค.
์์กด์ฑ์ด ์
๋ฐ์ดํธ ๋์์ต๋๋ค. (Werkzeug >= 0.14, Jinja >= 2.10, itsdangersou >= 0.24, Click >= 5.1)
๋ช
๋ น์ค์์ ์ฑ์ ์คํํ ๋ app.run์ ์๋ตํ์ต๋๋ค. ๋๋ฒ๊น
ํ๊ธฐ์ ํผ๋์ค๋ฌ์ด ๋์์ ํผํ ์ ์๊ฒ ๋์์ต๋๋ค.
JSONIFY_PRETTYPRINT_REGULAR ๊ธฐ๋ณธ๊ฐ์ False๋ก ๋ฐ๊พธ์์ต๋๋ค. ์ด์ ๊ธฐ๋ณธ ์ค์ ์์๋ ๋๋ฒ๊ทธ ๋ชจ๋์ผ๋๋ง jsonify() ๊ฒฐ๊ณผ๊ฐ์ด prettify์
๋๋ค.
Flask.init์ด host_matching ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ด ๊ฐ์ url_map์ ์ค์ ํฉ๋๋ค.
Flask.init์ด static_host ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. static route๋ฅผ ์ ์ํ ๋, ์ด ๊ฐ์ host ์ธ์๋ก ๋๊น๋๋ค.
send_file()์ด attachement_filename์ ์ ๋์ฝ๋๋ฅผ ์ง์ํฉ๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด url_for()์ _scheme ๊ฐ์ handle_url_build_error()๋ก ๋๊น๋๋ค.
add_url_rule()์ด provide_automatic_options ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ด ๊ฐ์ OPTIONS method ์ถ๊ฐ๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ์๋๋ค.
MethodView ์๋ธ ํด๋์ค๋ค์ด ๋ถ๋ชจ ํด๋์ค๋ค์ method handlers๋ค์ ์์ ๋ฐ์ต๋๋ค.
์์ฒญ ์ด๊ธฐ์ ์ธ์
์ ์คํํ๋ ๋์ ์๊ธฐ๋ ์ค๋ฅ๋ค์ ์ฑ์ ์ค๋ฅ ํธ๋ค๋ฌ์์ ์ฒ๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค.
Blueprint์ json_encoder, json_decoder ์์ฑ์ด ์๊ฒผ์ต๋๋ค. ์ด ์์ฑ๋ค์ ์ฑ์ encoder์ decoder๋ฅผ ์ค๋ฒ๋ผ์ด๋ํฉ๋๋ค.
Flask.make_response()๊ฐ ์ ํจํ์ง ์์ Response Type๋ค์ ๋ํด ValueError ๋์ TypeError๋ฅผ ๋ฐ์์ํต๋๋ค. ์ ํด๋น Type์ด ์ ์ ํจํ์ง ์์์ง ์๋ ค์ฃผ๊ธฐ ์ํด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
CLI์ 'routes' ๋ช
๋ น์ ์ถ๊ฐํ์ต๋๋ค. ์ด ๋ช
๋ น์ ์ฑ์ ๋ฑ๋ก๋ ๋ผ์ฐํ
๋ค์ ๋ณด์ฌ์ค๋๋ค.
์ธ์
์ฟ ํค ๋๋ฉ์ธ์ด bare hostname(ex. localhost)์ด๊ฑฐ๋ IP๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ณด์ฌ์ค๋๋ค. Chrome๊ณผ ๊ฐ์ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
์ ํํ ์ธ์
์ฟ ํค ๋๋ฉ์ธ์ผ๋ก IP ์ฃผ์๋ฅผ ํ์ฉํฉ๋๋ค.
SERVER_NAME์์ SESSION_COOKIE_DOMAIN์ด ๊ฐ์ง๋๋ฉด, SESSION_COOKIE_DOMAIN์ด ์ค์ ๋ฉ๋๋ค.
์ฑ factory ํจ์ create_app ํน์ make_app์ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค.
flask ๋ช
๋ น์ผ๋ก ์์
ํ๊ธฐ ์ํด script_info ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ Factory ํจ์๊ฐ ํ์ ์์ต๋๋ค. ๋ง์ฝ์ ๋จ์ผ ์ธ์๋ script_info๋ผ๋ ์ด๋ฆ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์ผ๋ฉด, ScriptInfo ๊ฐ์ฒด๊ฐ ๋์ด๊ฐ๋๋ค.
์ฑ factory๋ฅผ FLASK_APP๋ก ์ค์ ํ ์ ์์ต๋๋ค. ํ์ํ๋ฉด ์ธ์๋ ๊ฐ์ด ๋ฃ์ ์ ์์ต๋๋ค. ex. FLASK_APP=myproject.app:create_app('dev').
FLASK_APP์ ๋ก์ปฌ ํจํค์ง๋ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. ๋ก์ปฌ ํจํค์ง๊ฐ ํธ์ง ๊ฐ๋ฅํ ์ํ๊ฐ ์๋์ด๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ฌผ๋ก pip install -e๋ฅผ ์ค์ ํ๋๊ฒ ์ ํธ๋๊ธด ํฉ๋๋ค.
View ํด๋์ค ์์ฑ provide_automatic_options๊ฐ add_url_rule()์์ ๊ฐ์ง๋์ด, as_view()์ ์ค์ ๋ฉ๋๋ค.
์ค๋ฅ ํธ๋ค ์์ 'blueprint, code', 'app, code', 'blueprint', 'exception', 'app exception'์ ๋ฑ๋ก๋ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ฒญ ์ค์ ์ธ์
์ ์ ๊ทผํ ๊ฒฝ์ฐ ์๋ต Vary ํค๋์ Cookie๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. (๋จ, ์ธ์
์ด ์ญ์ ๋์ง ์์์ด์ผ ํฉ๋๋ค.)
test_request_context()๊ฐ subdomain, url_scheme ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. base URL์ ๋ง๋ค ๋ ์ด ๊ฐ๋ค์ ์ฌ์ฉํฉ๋๋ค.
APPLICATION_ROOT ๊ธฐ๋ณธ๊ฐ์ '/'๋ก ์ค์ ํ์ต๋๋ค. ์ฌ์ค, ์๋๋ถํฐ ๊ฐ์ด None์ด๋ฉด '/'๋ก ์๋ํ๊ธด ํ์ต๋๋ค.
TRAP_BAD_REQUEST_ERRORS๊ฐ ๋๋ฒ๊ทธ ๋ชจ๋์์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ผ์ง๋๋ค. BadRequestKeyError ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ์ผ๋ฐ ๋ชจ๋์์๋ ์ผ๋ฐ์ ์ธ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋์ค์ง๋ง ๋๋ฒ๊ทธ ๋ชจ๋์์๋ ๋ฉ์์ง์ ์ค๋ฅ ํค๊ฐ์ด ๋ค์ด์์ต๋๋ค.
TaggedJSONSerializer์ ์๋ก์ด ํ๊ทธ๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ด๋ก ์ธ์
์ฟ ํค์ ๋ค๋ฅธ ํ์ ์ ์ฅ์ ์ง์ํฉ๋๋ค.
ํด๋น ์์ฒญ์ด ์์ง context stack์ ๋ค์ด๊ฐ์ง ์์์๋๋ง ์ธ์
์ ์ฝ๋๋ค. stream_with_context() ์ ๋ค๋ ์ดํฐ๊ฐ ํฌํจ๋ ๋ทฐ์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ธ์
์ ์ ๊ทผํ ์ ์์ต๋๋ค.
ํ
์คํธ ํด๋ผ์ด์ธํธ ์์ฒญ ๋ฉ์๋์ 'json' keyword ์ธ์๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋คํํ๊ณ ์ ์ ํ Content type์ ์ค์ ํฉ๋๋ค.
์์ฒญ ๋ฐ ์๋ต ํด๋์ค ๋ชจ๋์ ์ ์ฉ๋๋ Mixin์ JSON์ฒ๋ฆฌ๋ฅผ ์ถ์ถํ์ต๋๋ค. response์ is_json(), get_json() ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์ด JSON response ํ
์คํธ๊ฐ ๋ ์ฌ์์ง๋๋ค.
์ค๋ฅ ํธ๋ค๋ฌ ์บ์๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ์ด๋ ๋ช๋ช์ ์์ธ ์ฒ๋ฆฌ์ ์์ ์๊ณ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค. MRO ํต๊ณผ๋ฅผ ํผํ๋ ค๋ฉด ๊ฐ ์์ธ์ ๋ํด ๋ช
์์ ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํด์ผํฉ๋๋ค.
non-UTC datetime์ JSON ์ธ์ฝ๋ฉ ๋ฒ๊ทธ๋ฅผ ๊ณ ์ณค์ต๋๋ค.
ํ
ํ๋ฆฟ ์๋ reloading์ ์ด๋ฏธ jinja_env์ ์ ๊ทผํ๋๋ผ๋ ๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ์ ์งํฉ๋๋ค.
๋ค์ deprecated ์ฝ๋๋ค์ ์ ๊ฑฐํ์ต๋๋ค.
flask.ext - ํ์ฅ๋ค์ flask.ext namespace ๋ง๊ณ ์ง์ import ํด์ผํฉ๋๋ค. ex. import flask.ext.sqlalchemy -> import flask_sqlalchemy
Flask.init_jinja_globals - Flask.create_jinja_environment()๋ฅผ ํ์ฅํด์ ์ฌ์ฉํ์ธ์.
Flask.error_handlers - Flask.error_handler_spec์ผ๋ก ์ถ์ ํ ์ ์์ต๋๋ค. ํธ๋ค๋ฌ ๋ฑ๋ก์ Flask.errorhandler()๋ฅผ ์ฐ์ธ์.
Flask.request_globals_class - Flask.app_ctx_globals_class๋ฅผ ์ฐ์ธ์.
Flask.static_path - Flask.static_url_path๋ฅผ ์ฐ์ธ์.
Request.module - Request.blueprint๋ฅผ ์ฐ์ธ์.
Request.json - ์ด์ deprecate ๋์์ด ์๋๋๋ค.
EnvionBuilder ํน์ dict๋ฅผ test_client.open์ ๋๊ธฐ๋ ๊ฑธ ์ง์ํฉ๋๋ค.
python-dotenv๊ฐ ์ค์น๋์ด ์์ผ๋ฉด, flask ๋ช
๋ น๊ณผ Flask.run()์ .env, .flaskenv ํ์ผ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ ์
๋๋ค.
์ ์ฒด URL์ ํ
์คํธ ํด๋ผ์ด์ธํธ์ ๋๊ธฐ๋ฉด, PREFERRED_URL_SCHEME ๋์ ์ URL์ ์คํด์ด ์ฐ์
๋๋ค.
Flask.logger๊ฐ ๊ฐ๋จํด์ก์ต๋๋ค. LOGGER_NAME๊ณผ LOGGER_HANDLER_POLICY ์ค์ ์ ์์ด์ต๋๋ค. ๋ก๊ฑฐ ์ด๋ฆ์ ํญ์ flask.app์
๋๋ค. ย ๋ ๋ฒจ์ ์ฒซ๋ฒ์งธ ์ ๊ทผ ๋ ์ค์ ๋ฉ๋๋ค. ๋งค๋ฒ Flask.debug๋ฅผ ํ์ธํ์ง ์์ต๋๋ค. Flask.debug์ ๋ฐ๋ผ ํ์์ ํ๊ฐ๋ง ์ฐ์
๋๋ค. ์๋ฌด ํธ๋ค๋ฌ๋ ์ ๊ฑฐ๋์ง ์๊ณ , ์ด๋ค ํธ๋ค๋ฌ๋ ์ค์ ๋์ด์์ง ์์ ๊ฒฝ์ฐ์๋ง ์ถ๊ฐ๋ฉ๋๋ค.
Blueprint ๋ทฐ ํจ์๋ ์ (.)์ ํฌํจํ๋ฉด ์๋ฉ๋๋ค.
์ ํจํ์ง ์์ Range ํค๋ ์์ฒญ์ ์ํด ๋ฐ์ํ๋ ValueError ๋ฒ๊ทธ๋ฅผ ๊ณ ์ณค์ต๋๋ค.
๊ฐ๋ฐ ์๋ฒ๋ ๊ธฐ๋ณธ์ผ๋ก ์ค๋ ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
silent=True๋ก ์ค์ ์ ๊ฐ์ ธ์ค๋ฉด ENOTDIR ์ค๋ฅ๋ฅผ ๋ฌด์ํฉ๋๋ค.
๊ฐ๋ฐ ์๋ฒ์ HTTPS๋ฅผ ์ฐ๊ณ ์ถ์ผ๋ฉด --cert์ --key ์ต์
์ flask run์ ๋๊ธฐ๋ฉด ๋ฉ๋๋ค.
์ธ์
์ฟ ํค์ SameSite ์์ฑ์ ์ ์ดํ๋ ์ฉ๋๋ก SESSION_COOKIE_SAMESITE๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
ํ
์คํธ ์ฉ๋๋ก Flask CLI ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์๋ Click runner๋ฅผ ์์ฑํ ์ ์๋๋ก test_cli_runner()๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์๋ธ๋๋ฉ์ธ ๋งค์นญ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊บผ๋์์ต๋๋ค. SERVER_NAME ์ค์ ์ด ์์์ ์ผ๋ก ์ด๊ฒ์ ์ผ์ง ์์ต๋๋ค. subdomain_matching=True๋ฅผ Flask ์์ฑ์์ ๋๊น์ผ๋ก์จ ์ผค ์ ์์ต๋๋ค.
์ฑ์ blueprint๊ฐ ๋ฑ๋ก๋ ๋ blueprint url_prefix์์ ๋ง์ง๋ง /(slash)๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค(stripped).
silent๊ฐ True๋ฉด Request.get_json() ํ์ฑ์ ์คํจํ์๋ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ง ์์ต๋๋ค.
Request.get_json()๋ ๋์ด์ ์์ ์ธ์ฝ๋ฉ์ ์์ฉํ์ง ์์ต๋๋ค. ์์ฒญ JSON์ RFC 8259์ ๊ทผ๊ฑฐํ UTF-8์ด์ด์ผ ํฉ๋๋ค. (UTF-16, UTF-32๋ ์๋ ๊ฐ์งํฉ๋๋ค.)
๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌด์ํ์ ์ ์๋ ํฐ ์ฟ ํค์ ๋ํด Werkzeug๊ฐ ๊ฒฝ๊ณ ํ ๋ ์ด๋ฅผ ์ ์ดํ๊ธฐ ์ํด MAX_COOKIE_SIZE์ Response.max_cookie_size๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์์ ์ฐฝ์์ ๋ฌธ์๋ฅผ ๋ ์ฝ๊ฒ ๋ณผ ์ ์๊ฒ theme์ ์
๋ฐ์ดํธํ์ต๋๋ค.
ํํ ๋ฆฌ์ผ ๋ฌธ์์ ์์ ํ๋ก์ ๏ฟฝ๏ฟฝ๋ฅผ ์ฌ์์ฑํ์ต๋๋ค. ์๋ก์ด ์ ์ ๋ค์ด ํํ ๊ฒช๋ ์ด๋ ค์์ ๋๊ธฐ ์ํด ์ฒด๊ณํ๋ ์ ๊ทผ์ ํ์ต๋๋ค.
0 notes