{"id":89651,"date":"2025-07-31T22:53:34","date_gmt":"2025-07-31T15:53:34","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=89651"},"modified":"2025-07-31T22:53:36","modified_gmt":"2025-07-31T15:53:36","slug":"flask-framework-la-gi","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/","title":{"rendered":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">N\u1ed9i dung b\u00e0i vi\u1ebft<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Flask_framework_la_gi_Tai_sao_Flask_la_lua_chon_toi_uu_cho_web_framework\" >Flask framework l\u00e0 g\u00ec? T\u1ea1i sao Flask l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho web framework?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Kien_truc_cua_Flask_Framework_nhu_the_nao\" >Ki\u1ebfn tr\u00fac c\u1ee7a Flask Framework nh\u01b0 th\u1ebf n\u00e0o?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Flask_framework_hoat_dong_nhu_the_nao\" >Flask framework ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Cac_module_extension_pho_bien_cua_Flask\" >C\u00e1c module &amp; extension ph\u1ed5 bi\u1ebfn c\u1ee7a Flask<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Cac_cau_hoi_thuong_gap_ve_Flask_Framework\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask Framework<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Trong th\u1ebf gi\u1edbi ph\u00e1t tri\u1ec3n web hi\u1ec7n \u0111\u1ea1i, vi\u1ec7c l\u1ef1a ch\u1ecdn m\u1ed9t framework ph\u00f9 h\u1ee3p c\u00f3 th\u1ec3 quy\u1ebft \u0111\u1ecbnh hi\u1ec7u qu\u1ea3 v\u00e0 t\u1ed1c \u0111\u1ed9 tri\u1ec3n khai \u1ee9ng d\u1ee5ng. Flask framework l\u00e0 m\u1ed9t framework Python nh\u1eb9, linh ho\u1ea1t v\u00e0 d\u1ec5 h\u1ecdc, do \u0111\u00f3 n\u00f3 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn ph\u1ed5 bi\u1ebfn d\u00e0nh cho nh\u1eefng ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u ho\u1eb7c ph\u00e1t tri\u1ec3n c\u00e1c d\u1ef1 \u00e1n nh\u1ecf \u0111\u1ebfn trung b\u00ecnh.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft \u0111\u1ec3 hi\u1ec3u r\u00f5 h\u01a1n v\u1ec1:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flask framework l\u00e0 g\u00ec?<\/li>\n\n\n\n<li>T\u1ea1i sao Flask l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho web framework?<\/li>\n\n\n\n<li>Ki\u1ebfn tr\u00fac c\u1ee7a Flask Framework<\/li>\n\n\n\n<li>C\u00e1ch Flask Framework ho\u1ea1t \u0111\u1ed9ng<\/li>\n\n\n\n<li>C\u00e1c module &amp; extension ph\u1ed5 bi\u1ebfn c\u1ee7a Flask<\/li>\n\n\n\n<li>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask Framework<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-flask-framework-la-gi-t\u1ea1i-sao-flask-la-l\u1ef1a-ch\u1ecdn-t\u1ed1i-\u01b0u-cho-web-framework\"><span class=\"ez-toc-section\" id=\"Flask_framework_la_gi_Tai_sao_Flask_la_lua_chon_toi_uu_cho_web_framework\"><\/span><strong>Flask framework l\u00e0 g\u00ec? T\u1ea1i sao Flask l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho web framework?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Flask framework l\u00e0 m\u1ed9t micro framework \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh Python, \u0111\u1ec3 ph\u00e1t tri\u1ec3n nhanh c\u00e1c \u1ee9ng d\u1ee5ng web \u0111\u01a1n gi\u1ea3n \u0111\u1ebfn trung b\u00ecnh m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ee5 thu\u1ed9c v\u00e0o qu\u00e1 nhi\u1ec1u th\u01b0 vi\u1ec7n hay c\u00f4ng c\u1ee5 b\u00ean ngo\u00e0i.&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc th\u00eam: <strong><a href=\"https:\/\/itviec.com\/blog\/python-backend-framework\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python backend: Top 6 framework Python Backend ph\u1ed5 bi\u1ebfn nh\u1ea5t<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<p>Theo kh\u1ea3o s\u00e1t c\u1ee7a <a href=\"https:\/\/survey.stackoverflow.co\/2025\/\" target=\"_blank\" rel=\"noreferrer noopener\">Stack Overflow n\u0103m 2025<\/a>, Flask n\u1eb1m trong top 10 n\u1ec1n t\u1ea3ng web \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng nhi\u1ec1u nh\u1ea5t v\u1edbi 12.9% &#8211; t\u1ef7 l\u1ec7 l\u00fd t\u01b0\u1edfng \u0111\u1ed1i v\u1edbi m\u1ed9t micro framework. Flask \u0111\u01b0\u1ee3c xem l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho web framework b\u1edfi n\u00f3 d\u1ec5 h\u1ecdc, linh ho\u1ea1t v\u00e0 \u0111\u1ee7 m\u1ea1nh \u0111\u1ec3 m\u1edf r\u1ed9ng theo nhu c\u1ea7u, t\u1eeb c\u00e1c \u1ee9ng d\u1ee5ng nh\u1ecf \u0111\u1ebfn h\u1ec7 th\u1ed1ng web ph\u1ee9c t\u1ea1p.\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u1ec5 h\u1ecdc v\u00e0 d\u1ec5 b\u1eaft \u0111\u1ea7u<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask r\u1ea5t \u201cPythonic\u201d, ngh\u0129a l\u00e0 c\u00fa ph\u00e1p v\u00e0 c\u00e1ch ho\u1ea1t \u0111\u1ed9ng r\u1ea5t g\u1ea7n g\u0169i v\u1edbi c\u00e1ch vi\u1ebft Python thu\u1ea7n t\u00fay. Qu\u00e1 tr\u00ecnh h\u1ecdc t\u1eadp Flask c\u0169ng \u201cd\u1ec5 th\u1edf\u201d h\u01a1n so v\u1edbi web framework kh\u00e1c n\u00ean r\u1ea5t ph\u00f9 h\u1ee3p cho ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u l\u1eadp tr\u00ecnh web.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5: Khi \u0111\u00e3 c\u00e0i \u0111\u1eb7t m\u00f4i tr\u01b0\u1eddng Python v\u1edbi Anaconda, b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng web \u0111\u01a1n gi\u1ea3n nh\u01b0 \u201cHello World\u201d ch\u1ec9 v\u1edbi v\u00e0i d\u00f2ng code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from flask import Flask\napp = Flask(__name__)\n@app.route('\/')\ndef hello_world():\n    return 'Hello World!'\nif __name__ == '__main__':\n    app.run()<\/code><\/pre>\n\n\n\n<p>N\u1ebfu mu\u1ed1n ph\u00e1t tri\u1ec3n tr\u00ean m\u00e1y t\u00ednh c\u1ee5c b\u1ed9, b\u1ea1n c\u00f3 th\u1ec3 l\u01b0u ch\u01b0\u01a1ng tr\u00ecnh n\u00e0y trong file <code>server.py<\/code> v\u00e0 kh\u1edfi ch\u1ea1y \u1ee9ng d\u1ee5ng v\u1edbi l\u1ec7nh <code>python server.py<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python server.py\n * Serving Flask app 'server'\n * Running on http:\/\/127.0.0.1:5000\/ (Press CTRL+C to quit)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u0110\u01a1n gi\u1ea3n nh\u01b0ng linh ho\u1ea1t<\/strong><\/li>\n<\/ul>\n\n\n\n<p>D\u00f9 l\u00e0 m\u1ed9t micro framework, Flask v\u1eabn h\u1ed7 tr\u1ee3 chia nh\u1ecf \u1ee9ng d\u1ee5ng th\u00e0nh nhi\u1ec1u t\u1ec7p \u0111\u1ec3 d\u1ec5 qu\u1ea3n l\u00fd khi m\u1edf r\u1ed9ng. \u201cMicro\u201d \u1edf \u0111\u00e2y kh\u00f4ng c\u00f3 ngh\u0129a l\u00e0 h\u1ea1n ch\u1ebf m\u00e0 l\u00e0 cho l\u1eadp tr\u00ecnh vi\u00ean t\u00f9y ch\u1ecdn v\u00e0 t\u00edch h\u1ee3p c\u00e1c th\u01b0 vi\u1ec7n b\u00ean ngo\u00e0i m\u1ed9t c\u00e1ch linh ho\u1ea1t.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng cao<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask d\u1ec5 m\u1edf r\u1ed9ng v\u1edbi c\u00e1c th\u01b0 vi\u1ec7n b\u00ean ngo\u00e0i khi b\u1ea1n c\u1ea7n th\u00eam t\u00ednh n\u0103ng nh\u01b0 x\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng, x\u1eed l\u00fd form, k\u1ebft n\u1ed1i c\u01a1 s\u1edf d\u1eef li\u1ec7u,&#8230; R\u1ea5t ph\u00f9 h\u1ee3p cho c\u1ea3 \u1ee9ng d\u1ee5ng nh\u1ecf l\u1eabn c\u00e1c n\u1ec1n t\u1ea3ng web ph\u1ee9c t\u1ea1p.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>H\u1ed7 tr\u1ee3 t\u1ed1t cho ph\u00e1t tri\u1ec3n v\u00e0 tri\u1ec3n khai<\/strong><\/li>\n<\/ul>\n\n\n\n<p>V\u1edbi Flask, l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 th\u1ec3 ch\u1ea1y \u1ee9ng d\u1ee5ng tr\u1ef1c ti\u1ebfp tr\u00ean m\u00e1y c\u1ee5c b\u1ed9 nhanh ch\u00f3ng, ch\u1ec9 v\u1edbi l\u1ec7nh python <code>server.py<\/code>. D\u1ec5 d\u00e0ng tri\u1ec3n khai tr\u1ef1c tuy\u1ebfn qua c\u00e1c n\u1ec1n t\u1ea3ng nh\u01b0 PythonAnywhere.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>C\u1ed9ng \u0111\u1ed3ng l\u1edbn v\u00e0 t\u00e0i li\u1ec7u h\u1ecdc t\u1eadp phong ph\u00fa<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask l\u00e0 m\u1ed9t trong nh\u1eefng framework ph\u1ed5 bi\u1ebfn nh\u1ea5t hi\u1ec7n nay, n\u00ean \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt th\u01b0\u1eddng xuy\u00ean v\u00e0 c\u00f3 r\u1ea5t nhi\u1ec1u t\u00e0i li\u1ec7u, v\u00ed d\u1ee5 v\u00e0 c\u1ed9ng \u0111\u1ed3ng h\u1ed7 tr\u1ee3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-ki\u1ebfn-truc-c\u1ee7a-flask-framework-nh\u01b0-th\u1ebf-nao\"><span class=\"ez-toc-section\" id=\"Kien_truc_cua_Flask_Framework_nhu_the_nao\"><\/span><strong>Ki\u1ebfn tr\u00fac c\u1ee7a Flask Framework nh\u01b0 th\u1ebf n\u00e0o?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Flask \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n d\u1ef1a tr\u00ean Werkzeug WSGI toolkit v\u00e0 Jinja2 template. Trong \u0111\u00f3:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-werkzeug-wsgi-web-server-gateway-interface\"><strong>Werkzeug WSGI (Web Server Gateway Interface)<\/strong><\/h3>\n\n\n\n<p>Flask tu\u00e2n theo ti\u00eau chu\u1ea9n <strong>WSGI<\/strong>. \u0110\u00e2y l\u00e0 c\u1ea7u n\u1ed1i gi\u1eefa web server (nh\u01b0 Nginx, Apache) v\u00e0 \u1ee9ng d\u1ee5ng web Python. Nh\u1edd WSGI, Flask c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c tri\u1ec3n khai linh ho\u1ea1t tr\u00ean nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng m\u00e1y ch\u1ee7 kh\u00e1c nhau.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"348\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62-640x348.png\" alt=\"\" class=\"wp-image-89652\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62-640x348.png 640w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62-300x163.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62-200x109.png 200w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62-768x417.png 768w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-62.png 800w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>C\u1ea5u tr\u00fac b\u00ean trong WSGI Server khi ch\u1ea1y \u1ee9ng d\u1ee5ng Flask (MovieApp)<\/em><a href=\"https:\/\/cdn.hashnode.com\/res\/hashnode\/image\/upload\/v1650002022585\/eIc23u_LR.png?auto=compress,format&amp;format=webp\"><\/a><\/p>\n\n\n\n<p>B\u00ean c\u1ea1nh \u0111\u00f3, Flask \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng d\u1ef1a tr\u00ean <strong>Werkzeug<\/strong> &#8211; m\u1ed9t th\u01b0 vi\u1ec7n WSGI cung c\u1ea5p c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng y\u00eau c\u1ea7u (request), ph\u1ea3n h\u1ed3i (response) v\u00e0 c\u00e1c h\u00e0m ti\u1ec7n \u00edch (nh\u01b0 x\u1eed l\u00fd HTTP request, response, routing, middleware,&#8230;). V\u1edbi Werkzeug, Flask d\u1ec5 d\u00e0ng m\u1edf r\u1ed9ng m\u00e0 kh\u00f4ng r\u00e0ng bu\u1ed9c ng\u01b0\u1eddi d\u00f9ng v\u00e0o c\u1ea5u tr\u00fac c\u1ed1 \u0111\u1ecbnh.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"245\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63-640x245.png\" alt=\"\" class=\"wp-image-89653\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63-640x245.png 640w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63-300x115.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63-200x77.png 200w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63-768x294.png 768w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-63.png 796w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>S\u01a1 \u0111\u1ed3 minh h\u1ecda lu\u1ed3ng request\/response t\u1eeb Client \u0111\u1ebfn \u1ee9ng d\u1ee5ng Flask qua Web Server v\u00e0 WSGI Server<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-jinja2-engine-t\u1ea1o-m\u1eabu-html-d\u1ed9ng\"><strong>Jinja2 &#8211; Engine t\u1ea1o m\u1eabu HTML \u0111\u1ed9ng<\/strong><\/h3>\n\n\n\n<p>Flask t\u00edch h\u1ee3p Jinja2 &#8211; m\u1ed9t h\u1ec7 th\u1ed1ng template cho ph\u00e9p k\u1ebft h\u1ee3p gi\u1eefa m\u1eabu HTML v\u00e0 d\u1eef li\u1ec7u Python \u0111\u1ec3 t\u1ea1o ra c\u00e1c trang web \u0111\u1ed9ng. Vi\u1ec7c s\u1eed d\u1ee5ng Jinja2 gi\u00fap t\u00e1ch bi\u1ec7t r\u00f5 r\u00e0ng gi\u1eefa ph\u1ea7n giao di\u1ec7n v\u00e0 logic x\u1eed l\u00fd, \u0111\u1ed3ng th\u1eddi cho ph\u00e9p l\u1eadp tr\u00ecnh vi\u00ean truy\u1ec1n c\u00e1c bi\u1ebfn Python v\u00e0o HTML m\u1ed9t c\u00e1ch linh ho\u1ea1t.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXergjGC1mMivcPkL60VD0mdlM9lBBXIXIu6Fr5p0vz-Z8oPnwV23wUuWfD5dS4MJD3Y6_fEk8UyQyHmvWq5le0nb5Ag1CjgQfJxN7MopJGDnjv3k1Rca34j41svjDTBqOK-mnCTuw?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/gertjanvanhethofblog.wordpress.com\/wp-content\/uploads\/2016\/02\/flask.png\"><em><\/em><\/a><\/p>\n\n\n\n<p class=\"has-text-align-center\"><em>S\u01a1 \u0111\u1ed3 m\u00f4 t\u1ea3 c\u00e1ch Flask d\u00f9ng Python v\u00e0 Jinja2 \u0111\u1ec3 t\u1ea1o HTML t\u1eeb template v\u00e0 tr\u1ea3 v\u1ec1 tr\u00ecnh duy\u1ec7t<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-core\"><strong>Flask core<\/strong><\/h3>\n\n\n\n<p>Flask gi\u1eef cho l\u00f5i (core) c\u1ee7a \u1ee9ng d\u1ee5ng \u0111\u01a1n gi\u1ea3n v\u00e0 kh\u00f4ng \u0111i k\u00e8m m\u1eb7c \u0111\u1ecbnh v\u1edbi c\u00e1c th\u00e0nh ph\u1ea7n nh\u01b0 ORM, authentication,&#8230; Nh\u01b0ng nh\u1edd c\u01a1 ch\u1ebf Extension, l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 th\u1ec3 th\u00eam b\u1ea5t c\u1ee9 t\u00ednh n\u0103ng (ORM, form validation, login,&#8230;).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-flask-framework-ho\u1ea1t-d\u1ed9ng-nh\u01b0-th\u1ebf-nao\"><span class=\"ez-toc-section\" id=\"Flask_framework_hoat_dong_nhu_the_nao\"><\/span><strong>Flask framework ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Khi b\u1ea1n ch\u1ea1y m\u1ed9t \u1ee9ng d\u1ee5ng, Flask framework kh\u00f4ng ch\u1ec9 ch\u1ea1y h\u00e0m b\u1ea1n \u0111\u1ecbnh ngh\u0129a trong @app.route m\u00e0 ph\u00eda sau l\u00e0 c\u1ea3 m\u1ed9t quy tr\u00ecnh x\u1eed l\u00fd b\u00e0i b\u1ea3n g\u1ed3m 5 b\u01b0\u1edbc:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-1-may-ch\u1ee7-web-ti\u1ebfp-nh\u1eadn-request\"><strong>B\u01b0\u1edbc 1: M\u00e1y ch\u1ee7 web ti\u1ebfp nh\u1eadn request<\/strong><\/h3>\n\n\n\n<p>Khi m\u1ed9t ng\u01b0\u1eddi d\u00f9ng g\u1eedi y\u00eau c\u1ea7u truy c\u1eadp \u0111\u1ebfn \u1ee9ng d\u1ee5ng Flask th\u00f4ng qua tr\u00ecnh duy\u1ec7t, request \u0111\u1ea7u ti\u00ean s\u1ebd \u0111\u01b0\u1ee3c ti\u1ebfp nh\u1eadn b\u1edfi web server, c\u00f3 th\u1ec3 l\u00e0 Apache ho\u1eb7c Nginx. Web server n\u00e0y c\u00f3 th\u1ec3 \u0111\u1ea3m nh\u1eadn vai tr\u00f2 \u0111i\u1ec1u ph\u1ed1i, c\u00e2n b\u1eb1ng t\u1ea3i ho\u1eb7c x\u1eed l\u00fd SSL tr\u01b0\u1edbc khi chuy\u1ec3n ti\u1ebfp request \u0111\u1ebfn WSGI server.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfJyWTmOl0-w2iNAmkvf8xgiw76JzRVK99aNhQJVBtntkCb-40Txv5PLdOz8KXKdN6l2HEZnhikg3lN7_OrEZ5UoRJV6U334OsDQNge3prt-o_po4hrbwp05aMhlZPlKgl9nj6J7w?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>B\u01b0\u1edbc 1: Web Server (Apache\/Nginx) ti\u1ebfp nh\u1eadn request t\u1eeb tr\u00ecnh duy\u1ec7t, x\u1eed l\u00fd ban \u0111\u1ea7u r\u1ed3i chuy\u1ec3n ti\u1ebfp \u0111\u1ebfn WSGI Server \u0111\u1ec3 b\u1eaft \u0111\u1ea7u quy tr\u00ecnh x\u1eed l\u00fd trong Flask<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-2-wsgi-server-x\u1eed-ly\"><strong>B\u01b0\u1edbc 2: WSGI server x\u1eed l\u00fd<\/strong><\/h3>\n\n\n\n<p>Gunicorn, uWSGI ho\u1eb7c mod_wsgi l\u00e0 nh\u1eefng WSGI server ph\u1ed5 bi\u1ebfn hi\u1ec7n nay. \u1ede b\u01b0\u1edbc n\u00e0y, WSGI Server s\u1ebd g\u1ecdi \u1ee9ng d\u1ee5ng Flask th\u00f4ng qua m\u1ed9t callable c\u00f3 t\u00ean (Flask.wsgi_app().&nbsp;<\/p>\n\n\n\n<p>Khi nh\u1eadn \u0111\u01b0\u1ee3c request, Flask s\u1ebd kh\u1edfi \u0111\u1ed9ng qu\u00e1 tr\u00ecnh x\u1eed l\u00fd b\u1eb1ng c\u00e1ch l\u01b0u th\u00f4ng tin \u1ee9ng d\u1ee5ng v\u00e0 th\u00f4ng tin y\u00eau c\u1ea7u v\u00e0o hai c\u1ea5u tr\u00fac \u0111\u1eb7c bi\u1ec7t l\u00e0 Application Context v\u00e0 Request Context. Nh\u1edd \u0111\u00f3, Flask c\u00f3 th\u1ec3 qu\u1ea3n l\u00fd d\u1eef li\u1ec7u \u1ee9ng d\u1ee5ng v\u00e0 request ri\u00eang bi\u1ec7t cho t\u1eebng ng\u01b0\u1eddi d\u00f9ng m\u1ed9t c\u00e1ch an to\u00e0n v\u00e0 hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcmW3DcAoeNXdfmx7_CqmjL9ykMGKneG9MybI9LDhqsGvJUb-_0PZofhrXzQZKEY2ZhAymDbGkiBPgXjlZyu6Rnqu84y0A5s5WRk4WNintW8iLJNu8oZIcGGkb4YteJmr5tv2K2GA?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>B\u01b0\u1edbc 2: WSGI Server g\u1ecdi Flask, kh\u1edfi t\u1ea1o Application Context v\u00e0 Request Context \u0111\u1ec3 x\u1eed l\u00fd request<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-3-view-function\"><strong>B\u01b0\u1edbc 3: View Function<\/strong><\/h3>\n\n\n\n<p>Ti\u1ebfp theo, Flask s\u1ebd g\u1ecdi h\u00e0m x\u1eed l\u00fd b\u1ea1n \u0111\u00e3 \u0111\u1ecbnh ngh\u0129a v\u1edbi @app.route. H\u00e0m n\u00e0y s\u1ebd x\u1eed l\u00fd request v\u00e0 tr\u1ea3 v\u1ec1 n\u1ed9i dung ph\u1ea3n h\u1ed3i. Flask s\u1eed d\u1ee5ng c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng nh\u01b0 request v\u00e0 current_app \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o m\u1ecdi th\u00f4ng tin \u0111\u1ec1u \u0111\u00fang v\u1edbi ng\u1eef c\u1ea3nh hi\u1ec7n t\u1ea1i c\u1ee7a t\u1eebng request c\u1ee5 th\u1ec3.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXf4OYUjs3KuuIznAdc3fJHFo8fXXcOlF-rG_wR_f0Ysamz9gixMbZRx8vFSU5hYxsQwdKtghf8HgrhXcw8nGpoHmpzZqjbJAh1YTPL6SZG65aicxYEhVew8qUpvSfkUPilc5Q5mIQ?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>B\u01b0\u1edbc 3: Flask g\u1ecdi h\u00e0m view t\u01b0\u01a1ng \u1ee9ng v\u1edbi route, x\u1eed l\u00fd request v\u00e0 t\u1ea1o response d\u1ef1a tr\u00ean ng\u1eef c\u1ea3nh hi\u1ec7n t\u1ea1i.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-4-proxy\"><strong>B\u01b0\u1edbc 4: Proxy<\/strong><\/h3>\n\n\n\n<p>Trong Flask, c\u00e1c h\u00e0m x\u1eed l\u00fd (view function) kh\u00f4ng truy c\u1eadp tr\u1ef1c ti\u1ebfp v\u00e0o \u0111\u1ed1i t\u01b0\u1ee3ng \u1ee9ng d\u1ee5ng ho\u1eb7c request c\u1ee5 th\u1ec3. Thay v\u00e0o \u0111\u00f3, ch\u00fang s\u1eed d\u1ee5ng c\u00e1c proxy \u0111\u1eb7c bi\u1ec7t \u0111\u1ec3 truy xu\u1ea5t th\u00f4ng tin m\u1ed9t c\u00e1ch an to\u00e0n v\u00e0 linh ho\u1ea1t:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>current_app<\/strong>: L\u00e0 m\u1ed9t proxy cho ph\u00e9p truy c\u1eadp ng\u1eef c\u1ea3nh \u1ee9ng d\u1ee5ng (application context) hi\u1ec7n t\u1ea1i.<\/li>\n\n\n\n<li><strong>request:<\/strong> L\u00e0 m\u1ed9t proxy cho ph\u00e9p truy c\u1eadp ng\u1eef c\u1ea3nh y\u00eau c\u1ea7u (request context) hi\u1ec7n t\u1ea1i.<\/li>\n<\/ul>\n\n\n\n<p>Trong c\u00e1c m\u00f4i tr\u01b0\u1eddng \u0111a lu\u1ed3ng ho\u1eb7c x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi, vi\u1ec7c s\u1eed d\u1ee5ng bi\u1ebfn to\u00e0n c\u1ee5c kh\u00f4ng \u0111\u01b0\u1ee3c ki\u1ec3m so\u00e1t c\u00f3 th\u1ec3 d\u1eabn \u0111\u1ebfn xung \u0111\u1ed9t d\u1eef li\u1ec7u, \u0111i\u1ec1u ki\u1ec7n tranh ch\u1ea5p v\u00e0 r\u1ee7i ro b\u1ea3o m\u1eadt. Tuy nhi\u00ean, Flask kh\u1eafc ph\u1ee5c v\u1ea5n \u0111\u1ec1 n\u00e0y b\u1eb1ng c\u00e1ch tri\u1ec3n khai c\u00e1c ng\u0103n x\u1ebfp ng\u1eef c\u1ea3nh d\u01b0\u1edbi d\u1ea1ng \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ee5c b\u1ed9 theo ng\u1eef c\u1ea3nh (context-local objects).&nbsp;<\/p>\n\n\n\n<p>Thay v\u00ec chia s\u1ebb d\u1eef li\u1ec7u tr\u00ean to\u00e0n b\u1ed9 \u1ee9ng d\u1ee5ng, m\u1ed7i lu\u1ed3ng ho\u1eb7c coroutine \u0111\u01b0\u1ee3c c\u1ea5p ph\u00e1t m\u1ed9t phi\u00ean b\u1ea3n ri\u00eang bi\u1ec7t c\u1ee7a ng\u1eef c\u1ea3nh \u1ee9ng d\u1ee5ng v\u00e0 ng\u1eef c\u1ea3nh y\u00eau c\u1ea7u. C\u00e1ch ti\u1ebfp c\u1eadn n\u00e0y \u0111\u1ea3m b\u1ea3o t\u00ednh an to\u00e0n trong x\u1eed l\u00fd song song, \u0111\u1ed3ng th\u1eddi duy tr\u00ec kh\u1ea3 n\u0103ng truy c\u1eadp \u0111\u01a1n gi\u1ea3n th\u00f4ng qua c\u00e1c proxy nh\u01b0 request v\u00e0 current_app.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd884hzIpWDia4aK4AdK5IeoDZkgJ8C6vi2B0xe7Hf3gGQ_GSNiQfrVuQjBtqki_tIRfcFrJCSvek4rOFiVDPdVcLmioPMt8Fxc3uOVTo0vWeWc_2ElNE5eTr-MPZ4wK4Z9HfkBtg?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>B\u01b0\u1edbc 4: Flask s\u1eed d\u1ee5ng proxy request v\u00e0 current_app \u0111\u1ec3 truy c\u1eadp ng\u1eef c\u1ea3nh hi\u1ec7n t\u1ea1i m\u1ed9t c\u00e1ch an to\u00e0n trong m\u00f4i tr\u01b0\u1eddng \u0111a lu\u1ed3ng ho\u1eb7c x\u1eed l\u00fd \u0111\u1ed3ng th\u1eddi.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-5-response\"><strong>B\u01b0\u1edbc 5: Response<\/strong><\/h3>\n\n\n\n<p>K\u1ebft th\u00fac qu\u00e1 tr\u00ecnh, Flask s\u1ebd tr\u1ea3 v\u1ec1 m\u1ed9t HTTP response th\u00f4ng qua WSGI Server. R\u1ed3i ti\u1ebfp t\u1ee5c chuy\u1ec3n qua Web Server tr\u01b0\u1edbc khi \u0111\u01b0\u1ee3c g\u1eedi tr\u1edf l\u1ea1i tr\u00ecnh duy\u1ec7t c\u1ee7a ng\u01b0\u1eddi d\u00f9ng. To\u00e0n b\u1ed9 quy tr\u00ecnh n\u00e0y di\u1ec5n ra nhanh ch\u00f3ng v\u00e0 t\u1ed1i \u01b0u nh\u1edd c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng gi\u1eefa c\u00e1c l\u1edbp x\u1eed l\u00fd trong Flask v\u00e0 s\u1ef1 h\u1ed7 tr\u1ee3 c\u1ee7a chu\u1ea9n WSGI.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfvHEst8kCj96ibpprOUNPhw9GpKrdSBx29sDqhk93e_IW_Mh5FGENpi-u8RL2Df-6cpTxFqc7S8O42R9RY0Fp6WsqR2paW25E3SviJb3QMTVnTU2ECVvDIhXPPLmjQdoY1HphZYw?key=4p48Qw3mEDdYgNzuhSocmA\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><em>B\u01b0\u1edbc 5: Flask t\u1ea1o HTTP response, g\u1eedi qua WSGI Server v\u00e0 Web Server \u0111\u1ec3 tr\u1ea3 v\u1ec1 tr\u00ecnh duy\u1ec7t ng\u01b0\u1eddi d\u00f9ng.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-module-amp-extension-ph\u1ed5-bi\u1ebfn-c\u1ee7a-flask\"><span class=\"ez-toc-section\" id=\"Cac_module_extension_pho_bien_cua_Flask\"><\/span><strong>C\u00e1c module &amp; extension ph\u1ed5 bi\u1ebfn c\u1ee7a Flask<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Trong Flask, module th\u01b0\u1eddng \u0111\u01b0\u1ee3c hi\u1ec3u l\u00e0 c\u00e1c th\u00e0nh ph\u1ea7n ch\u1ee9c n\u0103ng ri\u00eang bi\u1ec7t trong m\u1ed9t \u1ee9ng d\u1ee5ng l\u1edbn, c\u00e1c module n\u00e0y c\u00f3 th\u1ec3 l\u00e0:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>T\u00ean module<\/strong><\/td><td><strong>M\u00f4 t\u1ea3<\/strong><\/td><\/tr><tr><td>_init_.py&nbsp;(Module Init)<\/td><td>N\u1eb1m trong th\u01b0 m\u1ee5c m\u1ed7i module (v\u00ed d\u1ee5 admin\/__init__.py). D\u00f9ng \u0111\u1ec3 kh\u1edfi t\u1ea1o module v\u00e0 cho Flask bi\u1ebft r\u1eb1ng \u0111\u00e2y l\u00e0 m\u1ed9t Blueprint ho\u1eb7c ph\u1ea7n m\u1edf r\u1ed9ng c\u1ee7a app.<\/td><\/tr><tr><td>url.py(Module URL)<\/td><td>X\u00e1c \u0111\u1ecbnh c\u00e1c route (\u0111\u01b0\u1eddng d\u1eabn URL) cho module t\u01b0\u01a1ng \u1ee9ng. T\u00e1ch ri\u00eang \u0111\u1ecbnh ngh\u0129a URL gi\u00fap qu\u1ea3n l\u00fd route r\u00f5 r\u00e0ng, nh\u1ea5t l\u00e0 khi app c\u00f3 nhi\u1ec1u module nh\u01b0 admin, user, product,&#8230;<\/td><\/tr><tr><td>views.py(Module Views)<\/td><td>Ch\u1ee9a c\u00e1c h\u00e0m x\u1eed l\u00fd logic c\u1ee7a view \u2013 c\u00e1c h\u00e0nh \u0111\u1ed9ng x\u1ea3y ra khi ng\u01b0\u1eddi d\u00f9ng truy c\u1eadp URL t\u01b0\u01a1ng \u1ee9ng. C\u00f3 th\u1ec3 t\u00e1ch th\u00e0nh nhi\u1ec1u file n\u1ebfu module ph\u1ee9c t\u1ea1p.<\/td><\/tr><tr><td>templates\/ (Module Templates)<\/td><td>Ch\u1ee9a c\u00e1c giao di\u1ec7n HTML (s\u1eed d\u1ee5ng Jinja2) ph\u1ee5c v\u1ee5 cho module \u0111\u00f3. V\u00ed d\u1ee5 admin\/templates\/admin\/main.html.<\/td><\/tr><tr><td>App root _init_.py<\/td><td>D\u00f9ng \u0111\u1ec3 kh\u1edfi t\u1ea1o to\u00e0n b\u1ed9 Flask app, nh\u01b0ng c\u00f3 th\u1ec3 gi\u1eef g\u1ecdn, c\u00f2n ph\u1ea7n l\u1edbn logic \u0111\u01b0\u1ee3c t\u00e1ch ra \u1edf c\u00e1c module ri\u00eang bi\u1ec7t.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Extensions (ti\u1ec7n \u00edch m\u1edf r\u1ed9ng) l\u00e0 c\u00e1c g\u00f3i Python b\u1ed5 sung gi\u00fap m\u1edf r\u1ed9ng ch\u1ee9c n\u0103ng c\u1ee7a Flask. Extensions \u0111\u01b0\u1ee3c c\u00e0i qua pip v\u00e0 t\u00edch h\u1ee3p th\u00f4ng qua init_app(). D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 Flask Extensions ph\u1ed5 bi\u1ebfn theo ch\u1ee9c n\u0103ng.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Ch\u1ee9c n\u0103ng<\/strong><\/td><td><strong>T\u00ean extensions<\/strong><\/td><td><strong>M\u00f4 t\u1ea3<\/strong><\/td><\/tr><tr><td rowspan=\"5\"><br><strong>X\u00e1c th\u1ef1c v\u00e0 b\u1ea3o m\u1eadt<\/strong><\/td><td>Flask-login<\/td><td>Qu\u1ea3n l\u00fd phi\u00ean \u0111\u0103ng nh\u1eadp ng\u01b0\u1eddi d\u00f9ng<\/td><\/tr><tr><td>Flask-HTTPAuth<\/td><td>T\u1ea1o Basic\/Digest HTTP Auth.<\/td><\/tr><tr><td>Flask-Authorize<\/td><td>Tri\u1ec3n khai ACL &amp; RBAC (role-based acces control).<\/td><\/tr><tr><td>Flask-Security-Too<\/td><td>B\u1ea3o m\u1eadt to\u00e0n di\u1ec7n, ph\u00f9 h\u1ee3p cho SPA (Single Page Apps).<\/td><\/tr><tr><td>Flask-Praetorian<\/td><td>B\u1ea3o m\u1eadt JWT, d\u00f9ng t\u1ed1t v\u1edbi React\/Angular.<\/td><\/tr><tr><td rowspan=\"3\"><strong>API &amp; Giao ti\u1ebfp<\/strong><\/td><td>Flask-RESTX<\/td><td>T\u1ea1o REST API nhanh ch\u00f3ng, t\u00edch h\u1ee3p Swagger docs.<br>T\u00ecm hi\u1ec3u chi ti\u1ebft trong b\u00e0i vi\u1ebft <strong><a href=\"https:\/\/itviec.com\/blog\/flask-api-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask<\/a><\/strong><\/td><\/tr><tr><td>Flask-Ask<\/td><td>T\u1ea1o k\u1ef9 n\u0103ng Alexa theo phong c\u00e1ch Flask.<\/td><\/tr><tr><td>Flask-SocketIO<\/td><td>Giao ti\u1ebfp hai chi\u1ec1u th\u1eddi gian th\u1ef1c (WebSocket)<\/td><\/tr><tr><td rowspan=\"3\"><strong>Ng\u01b0\u1eddi d\u00f9ng &amp; Giao di\u1ec7n<\/strong><\/td><td>Flask-User<\/td><td>Qu\u1ea3n l\u00fd t\u00e0i kho\u1ea3n, x\u00e1c th\u1ef1c, email x\u00e1c nh\u1eadn,&#8230;<\/td><\/tr><tr><td>Flask-WTF<\/td><td>T\u00edch h\u1ee3p WTForms \u0111\u1ec3 x\u1eed l\u00fd form v\u1edbi CSRF protection<\/td><\/tr><tr><td>Flask-Bootstrap<\/td><td>D\u1ec5 d\u00e0ng t\u00edch h\u1ee3p Bootstrap v\u00e0o giao di\u1ec7n Flask<\/td><\/tr><tr><td><strong>Debug &amp; Dev Tool<\/strong><\/td><td>Flask-DebugToolbar<\/td><td>Cung c\u1ea5p c\u00f4ng c\u1ee5 debug chi ti\u1ebft trong m\u00f4i tr\u01b0\u1eddng ph\u00e1t tri\u1ec3n.<\/td><\/tr><tr><td rowspan=\"2\"><strong>Boilerplate \/ Template d\u1ef1 \u00e1n<\/strong><\/td><td>Flask-base<\/td><td>D\u1ef1 \u00e1n m\u1eabu t\u00edch h\u1ee3p s\u1eb5n SQLAlchemy, Redis, x\u00e1c th\u1ef1c,&#8230;<\/td><\/tr><tr><td>Flask-Vue.JS-Template<\/td><td>Starter project k\u1ebft h\u1ee3p Flask + Vue.js + REST API.<\/td><\/tr><tr><td colspan=\"2\"><strong>Flask-Meld<\/strong><\/td><td>Cho ph\u00e9p vi\u1ebft front-end t\u01b0\u01a1ng t\u00e1c b\u1eb1ng Python th\u00f4ng qua component<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-flask-framework\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Flask_Framework\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask Framework<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-framework-co-h\u1ed7-tr\u1ee3-async-khong\"><strong>Flask framework c\u00f3 h\u1ed7 tr\u1ee3 async kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Flask 2.0 (\u0111\u01b0\u1ee3c ph\u00e1t h\u00e0nh v\u00e0o ng\u00e0y 11\/05\/2021) \u0111\u00e3 b\u1ed5 sung nhi\u1ec1u t\u00ednh n\u0103ng m\u1edbi, trong \u0111\u00f3 quan tr\u1ecdng nh\u1ea5t l\u00e0 h\u1ed7 tr\u1ee3 t\u00edch h\u1ee3p cho c\u00e1c h\u00e0m b\u1ea5t \u0111\u1ed3ng b\u1ed9 (async). Ngo\u00e0i ra, phi\u00ean b\u1ea3n n\u00e0y c\u0169ng m\u1edf r\u1ed9ng kh\u1ea3 n\u0103ng x\u1eed l\u00fd l\u1ed7i, th\u00eam h\u1ed7 tr\u1ee3 cho c\u00e1c h\u00e0m x\u1eed l\u00fd tr\u01b0\u1edbc\/sau y\u00eau c\u1ea7u (before\/after request) v\u00e0 callback khi x\u00f3a \u0111\u1ed1i t\u01b0\u1ee3ng.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-framework-co-phu-h\u1ee3p-v\u1edbi-microservices-khong\"><strong>Flask framework c\u00f3 ph\u00f9 h\u1ee3p v\u1edbi microservices kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Flask l\u00e0 l\u1ef1a ch\u1ecdn h\u00e0ng \u0111\u1ea7u cho c\u00e1c h\u1ec7 th\u1ed1ng microservices vi\u1ebft b\u1eb1ng Python. V\u00ec n\u00f3 l\u00e0 m\u1ed9t microframework nh\u1eb9, linh ho\u1ea1t v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng, ch\u1ec9 cho ph\u00e9p t\u00edch h\u1ee3p nh\u1eefng th\u00e0nh ph\u1ea7n th\u1eadt s\u1ef1 c\u1ea7n thi\u1ebft. Nh\u1edd \u0111\u00f3, m\u1ed7i microservice c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng \u0111\u01a1n gi\u1ea3n, g\u1ecdn nh\u1eb9 v\u00e0 d\u1ec5 b\u1ea3o tr\u00ec. Flask \u0111\u1eb7c bi\u1ec7t l\u00fd t\u01b0\u1edfng cho:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ph\u00e1t tri\u1ec3n API nh\u1ecf g\u1ecdn c\u00f9ng c\u00e1c microservices REST \u0111\u1ed9c l\u1eadp.<\/li>\n\n\n\n<li>Nhanh ch\u00f3ng tri\u1ec3n khai v\u00e0 d\u1ec5 d\u00e0ng th\u1ef1c hi\u1ec7n ki\u1ec3m th\u1eed.<\/li>\n\n\n\n<li>D\u1ef1 \u00e1n \u01b0u ti\u00ean t\u1ed1c \u0111\u1ed9 ph\u00e1t tri\u1ec3n v\u00e0 ti\u1ebft ki\u1ec7m t\u00e0i nguy\u00ean.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-framework-co-thay-th\u1ebf-d\u01b0\u1ee3c-django-khong\"><strong>Flask framework c\u00f3 thay th\u1ebf \u0111\u01b0\u1ee3c Django kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>N\u1ebfu x\u00e2y d\u1ef1ng microservices, API nh\u1eb9 ho\u1eb7c prototype nhanh v\u00e0 mu\u1ed1n to\u00e0n quy\u1ec1n ki\u1ec3m so\u00e1t, th\u00ec Flask c\u00f3 th\u1ec3 thay th\u1ebf Django. Ng\u01b0\u1ee3c l\u1ea1i, n\u1ebfu ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng web l\u1edbn, y\u00eau c\u1ea7u nhi\u1ec1u t\u00ednh n\u0103ng ph\u1ee9c t\u1ea1p v\u00e0 b\u1ea3o m\u1eadt cao, Django v\u1eabn l\u00e0 l\u1ef1a ch\u1ecdn \u1ed5n \u0111\u1ecbnh v\u00e0 nhanh ch\u00f3ng h\u01a1n, nh\u1edd s\u1ef1 t\u00edch h\u1ee3p s\u1eb5n v\u00e0 c\u1ea5u tr\u00fac ch\u1eb7t ch\u1ebd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-framework-th\u01b0\u1eddng-d\u01b0\u1ee3c-dung-trong-tr\u01b0\u1eddng-h\u1ee3p-nao\"><strong>Flask framework th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng trong tr\u01b0\u1eddng h\u1ee3p n\u00e0o?<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X\u00e2y d\u1ef1ng RESTful APIs<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask r\u1ea5t ph\u00f9 h\u1ee3p \u0111\u1ec3 t\u1ea1o c\u00e1c API v\u00ec c\u00fa ph\u00e1p g\u1ecdn nh\u1eb9, d\u1ec5 d\u00f9ng. V\u00ed d\u1ee5 x\u00e2y d\u1ef1ng API cung c\u1ea5p d\u1eef li\u1ec7u th\u1eddi ti\u1ebft cho ng\u01b0\u1eddi d\u00f9ng:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from flask import Flask, jsonify\n@app.route('\/weather')\ndef get_weather():\n____return jsonify({\"city\": \"New York\", \"temperature\": \"22\u00b0C\", \"condition\": \"Cloudy\"})<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng web nh\u1ecf v\u00e0 trung b\u00ecnh<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask framework h\u1ed7 tr\u1ee3 x\u00e2y d\u1ef1ng c\u00e1c website nh\u01b0 blog c\u00e1 nh\u00e2n, portfolio ho\u1eb7c shop online \u0111\u01a1n gi\u1ea3n. V\u1edbi render_template, c\u00f3 th\u1ec3 k\u1ebft h\u1ee3p HTML v\u00e0 d\u1eef li\u1ec7u Python \u0111\u1ec3 hi\u1ec3n th\u1ecb giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X\u00e2y d\u1ef1ng dashboard theo th\u1eddi gian th\u1ef1c<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask c\u00f3 th\u1ec3 t\u00edch h\u1ee3p v\u1edbi Plotly, Dash ho\u1eb7c Matplotlib \u0111\u1ec3 t\u1ea1o c\u00e1c b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n d\u1eef li\u1ec7u \u0111\u1ed9ng.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng<\/strong><\/li>\n<\/ul>\n\n\n\n<p>C\u00f3 th\u1ec3 th\u00eam ch\u1ee9c n\u0103ng \u0111\u0103ng nh\u1eadp, \u0111\u0103ng k\u00fd v\u00e0 qu\u1ea3n l\u00fd ng\u01b0\u1eddi d\u00f9ng v\u1edbi c\u00e1c th\u01b0 vi\u1ec7n nh\u01b0 Flask-Login ho\u1eb7c Flask-Bcrypt trong Flask. V\u00ed d\u1ee5:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tri\u1ec3n khai m\u00f4 h\u00ecnh h\u1ecdc m\u00e1y (Machine Learning)&nbsp;<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Flask gi\u00fap b\u1ea1n bi\u1ebfn m\u1ed9t m\u00f4 h\u00ecnh h\u1ecdc m\u00e1y th\u00e0nh API c\u00f3 th\u1ec3 nh\u1eadn d\u1eef li\u1ec7u \u0111\u1ea7u v\u00e0o v\u00e0 tr\u1ea3 v\u1ec1 d\u1ef1 \u0111o\u00e1n th\u00f4ng qua giao di\u1ec7n web.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-k\u1ebft\"><span class=\"ez-toc-section\" id=\"Tong_ket\"><\/span><strong>T\u1ed5ng k\u1ebft<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Flask framework tuy \u0111\u01a1n gi\u1ea3n nh\u01b0ng l\u1ea1i s\u1edf h\u1eefu m\u1ed9t ki\u1ebfn tr\u00fac linh ho\u1ea1t, cho ph\u00e9p l\u1eadp tr\u00ecnh vi\u00ean m\u1edf r\u1ed9ng v\u00e0 t\u00f9y ch\u1ec9nh theo nhu c\u1ea7u th\u1ef1c t\u1ebf. Nh\u1edd v\u00e0o thi\u1ebft k\u1ebf t\u1ed1i gi\u1ea3n, d\u1ec5 hi\u1ec3u v\u00e0 c\u1ed9ng \u0111\u1ed3ng h\u1ed7 tr\u1ee3 m\u1ea1nh m\u1ebd, framework n\u00e0y \u0111\u00e3 tr\u1edf th\u00e0nh c\u00f4ng c\u1ee5 l\u00fd t\u01b0\u1edfng cho nh\u1eefng d\u1ef1 \u00e1n \u0111\u01a1n gi\u1ea3n \u0111\u1ebfn chuy\u00ean s\u00e2u, y\u00eau c\u1ea7u t\u00ednh ki\u1ec3m so\u00e1t cao. Hy v\u1ecdng qua b\u00e0i vi\u1ebft n\u00e0y, b\u1ea1n \u0111\u00e3 c\u00f3 c\u00e1i nh\u00ecn r\u00f5 r\u00e0ng h\u01a1n v\u1ec1 c\u00e1ch Flask framework ho\u1ea1t \u0111\u1ed9ng c\u0169ng nh\u01b0 nh\u1eefng nguy\u00ean l\u00fd ki\u1ebfn tr\u00fac c\u1ed1t l\u00f5i gi\u00fap framework n\u00e0y tr\u1edf n\u00ean hi\u1ec7u qu\u1ea3 v\u00e0 \u0111\u01b0\u1ee3c \u01b0a chu\u1ed9ng trong gi\u1edbi ph\u00e1t tri\u1ec3n web v\u1edbi Python.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trong th\u1ebf gi\u1edbi ph\u00e1t tri\u1ec3n web hi\u1ec7n \u0111\u1ea1i, vi\u1ec7c l\u1ef1a ch\u1ecdn m\u1ed9t framework ph\u00f9 h\u1ee3p c\u00f3 th\u1ec3 quy\u1ebft \u0111\u1ecbnh hi\u1ec7u qu\u1ea3 v\u00e0 t\u1ed1c \u0111\u1ed9 tri\u1ec3n khai \u1ee9ng d\u1ee5ng. Flask framework l\u00e0 m\u1ed9t framework Python nh\u1eb9, linh ho\u1ea1t v\u00e0 d\u1ec5 h\u1ecdc, do \u0111\u00f3 n\u00f3 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn ph\u1ed5 bi\u1ebfn d\u00e0nh cho nh\u1eefng ng\u01b0\u1eddi m\u1edbi b\u1eaft [&hellip;]<\/p>\n","protected":false},"author":213,"featured_media":90287,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109,10107],"tags":[10348],"class_list":["post-89651","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it","category-tai-lieu-python","tag-flask"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf - ITviec Blog<\/title>\n<meta name=\"description\" content=\"T\u00ecm hi\u1ec3u t\u1ea5t t\u1ea7n t\u1eadt v\u1ec1 Flask framework - m\u1ed9t micro framework Python d\u1ec5 h\u1ecdc, \u0111\u01a1n gi\u1ea3n nh\u01b0ng t\u1ed1i \u01b0u cho c\u00e1c d\u1ef1 \u00e1n ph\u00e1t tri\u1ec3n web \u0111\u01a1n gi\u1ea3n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf\" \/>\n<meta property=\"og:description\" content=\"Trong th\u1ebf gi\u1edbi ph\u00e1t tri\u1ec3n web hi\u1ec7n \u0111\u1ea1i, vi\u1ec7c l\u1ef1a ch\u1ecdn m\u1ed9t framework ph\u00f9 h\u1ee3p c\u00f3 th\u1ec3 quy\u1ebft \u0111\u1ecbnh hi\u1ec7u qu\u1ea3 v\u00e0 t\u1ed1c \u0111\u1ed9 tri\u1ec3n khai \u1ee9ng d\u1ee5ng. Flask framework l\u00e0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/\" \/>\n<meta property=\"og:site_name\" content=\"ITviec Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITviec\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-31T15:53:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-31T15:53:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1347\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Linh Trao\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ITviec\" \/>\n<meta name=\"twitter:site\" content=\"@ITviec\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Linh Trao\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf - ITviec Blog","description":"T\u00ecm hi\u1ec3u t\u1ea5t t\u1ea7n t\u1eadt v\u1ec1 Flask framework - m\u1ed9t micro framework Python d\u1ec5 h\u1ecdc, \u0111\u01a1n gi\u1ea3n nh\u01b0ng t\u1ed1i \u01b0u cho c\u00e1c d\u1ef1 \u00e1n ph\u00e1t tri\u1ec3n web \u0111\u01a1n gi\u1ea3n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/","og_locale":"vi_VN","og_type":"article","og_title":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf","og_description":"Trong th\u1ebf gi\u1edbi ph\u00e1t tri\u1ec3n web hi\u1ec7n \u0111\u1ea1i, vi\u1ec7c l\u1ef1a ch\u1ecdn m\u1ed9t framework ph\u00f9 h\u1ee3p c\u00f3 th\u1ec3 quy\u1ebft \u0111\u1ecbnh hi\u1ec7u qu\u1ea3 v\u00e0 t\u1ed1c \u0111\u1ed9 tri\u1ec3n khai \u1ee9ng d\u1ee5ng. Flask framework l\u00e0","og_url":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-07-31T15:53:34+00:00","article_modified_time":"2025-07-31T15:53:36+00:00","og_image":[{"width":2560,"height":1347,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png","type":"image\/png"}],"author":"Linh Trao","twitter_card":"summary_large_image","twitter_creator":"@ITviec","twitter_site":"@ITviec","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Linh Trao","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"16 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/"},"author":{"name":"Linh Trao","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/6d1bcbfa05475cbc5a2eaf0727501a16"},"headline":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf","datePublished":"2025-07-31T15:53:34+00:00","dateModified":"2025-07-31T15:53:36+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/"},"wordCount":3615,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png","keywords":["flask"],"articleSection":["Chuy\u00ean m\u00f4n IT","T\u00e0i li\u1ec7u Python"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/","url":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/","name":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png","datePublished":"2025-07-31T15:53:34+00:00","dateModified":"2025-07-31T15:53:36+00:00","description":"T\u00ecm hi\u1ec3u t\u1ea5t t\u1ea7n t\u1eadt v\u1ec1 Flask framework - m\u1ed9t micro framework Python d\u1ec5 h\u1ecdc, \u0111\u01a1n gi\u1ea3n nh\u01b0ng t\u1ed1i \u01b0u cho c\u00e1c d\u1ef1 \u00e1n ph\u00e1t tri\u1ec3n web \u0111\u01a1n gi\u1ea3n.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/flask-framework-la-gi\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-framework-scaled.png","width":800,"height":421,"caption":"flask framework - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/flask-framework-la-gi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Chuy\u00ean m\u00f4n IT","item":"https:\/\/itviec.com\/blog\/chuyen-mon-it\/"},{"@type":"ListItem","position":2,"name":"Flask Framework l\u00e0 g\u00ec: C\u1ea5u tr\u00fac, nguy\u00ean l\u00fd v\u00e0 \u1ee9ng d\u1ee5ng th\u1ef1c t\u1ebf"}]},{"@type":"WebSite","@id":"https:\/\/itviec.com\/blog\/#website","url":"https:\/\/itviec.com\/blog\/","name":"ITviec Blog","description":"IT Jobs &amp; People in Vietnam","publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itviec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/itviec.com\/blog\/#organization","name":"ITviec","url":"https:\/\/itviec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","width":1800,"height":1800,"caption":"ITviec"},"image":{"@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ITviec","https:\/\/x.com\/ITviec","https:\/\/www.linkedin.com\/company\/itviec","https:\/\/www.youtube.com\/channel\/UCYthAQ3bcGr57M_ag5gHDvQ"]},{"@type":"Person","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/6d1bcbfa05475cbc5a2eaf0727501a16","name":"Linh Trao","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/trao-thi-tung-linh-author-e1709892478113-100x100.jpg","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/trao-thi-tung-linh-author-e1709892478113-100x100.jpg","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/trao-thi-tung-linh-author-e1709892478113-100x100.jpg","caption":"Linh Trao"},"url":"https:\/\/itviec.com\/blog\/author\/linh-trao\/"}]}},"_links":{"self":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/users\/213"}],"replies":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/comments?post=89651"}],"version-history":[{"count":4,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89651\/revisions"}],"predecessor-version":[{"id":90288,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89651\/revisions\/90288"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/90287"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=89651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=89651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=89651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}