{"id":89204,"date":"2025-07-10T15:09:29","date_gmt":"2025-07-10T08:09:29","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=89204"},"modified":"2025-07-10T15:09:32","modified_gmt":"2025-07-10T08:09:32","slug":"flask-api-la-gi","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/","title":{"rendered":"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask"},"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-api-la-gi\/#Flask_la_gi_API_REST_API_la_gi_Vi_sao_nen_chon_Flask_de_xay_dung_API\" >Flask l\u00e0 g\u00ec? API (REST API) l\u00e0 g\u00ec? V\u00ec sao n\u00ean ch\u1ecdn Flask \u0111\u1ec3 x\u00e2y d\u1ef1ng API?<\/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-api-la-gi\/#Huong_dan_chi_tiet_tung_buoc_tao_API_dau_tien_cua_ban_bang_Flask\" >H\u01b0\u1edbng d\u1eabn chi ti\u1ebft t\u1eebng b\u01b0\u1edbc t\u1ea1o API \u0111\u1ea7u ti\u00ean c\u1ee7a b\u1ea1n b\u1eb1ng Flask<\/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-api-la-gi\/#So_sanh_diem_khac_biet_giua_Flask_API_va_cac_REST_API_khac_trong_Python\" >So s\u00e1nh \u0111i\u1ec3m kh\u00e1c bi\u1ec7t gi\u1eefa Flask API v\u00e0 c\u00e1c REST API kh\u00e1c trong Python<\/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-api-la-gi\/#Cac_cau_hoi_thuong_gap_ve_Flask_API\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask API<\/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-api-la-gi\/#Tong_ket\" >T\u1ed5ng k\u1ebft<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Flask l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd \u0111\u1ec3 x\u00e2y d\u1ef1ng REST API m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 linh ho\u1ea1t. Flask \u0111\u00e1p \u1ee9ng hi\u1ec7u qu\u1ea3 c\u00e1c nhu c\u1ea7u t\u1eeb k\u1ebft n\u1ed1i v\u1edbi \u1ee9ng d\u1ee5ng web, mobile hay t\u00edch h\u1ee3p v\u1edbi h\u1ec7 th\u1ed1ng th\u1ee9 3,&#8230; Trong b\u00e0i vi\u1ebft n\u00e0y, h\u00e3y c\u00f9ng ITviec b\u1eaft \u0111\u1ea7u nh\u1eefng b\u01b0\u1edbc c\u01a1 b\u1ea3n nh\u1ea5t \u0111\u1ec3 t\u1ea1o m\u1ed9t Flask API \u0111\u01a1n gi\u1ea3n nh\u00e9.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft \u0111\u1ec3 hi\u1ec3u r\u00f5 h\u01a1n:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flask API l\u00e0 g\u00ec? V\u00ec sao n\u00ean ch\u1ecdn Flask \u0111\u1ec3 x\u00e2y d\u1ef1ng API?<\/li>\n\n\n\n<li>M\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf c\u1ee7a framework Flask l\u00e0 g\u00ec?<\/li>\n\n\n\n<li>H\u01b0\u1edbng d\u1eabn c\u00e1ch t\u1ea1o API \u0111\u1ea7u ti\u00ean c\u1ee7a b\u1ea1n b\u1eb1ng Flask<\/li>\n\n\n\n<li>So s\u00e1nh \u0111i\u1ec3m kh\u00e1c bi\u1ec7t gi\u1eefa Flask API v\u00e0 c\u00e1c REST API kh\u00e1c trong Python<\/li>\n\n\n\n<li>Gi\u1ea3i \u0111\u00e1p c\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask API<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-flask-la-gi-api-rest-api-la-gi-vi-sao-nen-ch\u1ecdn-flask-d\u1ec3-xay-d\u1ef1ng-api\"><span class=\"ez-toc-section\" id=\"Flask_la_gi_API_REST_API_la_gi_Vi_sao_nen_chon_Flask_de_xay_dung_API\"><\/span><strong>Flask l\u00e0 g\u00ec? API (REST API) l\u00e0 g\u00ec? V\u00ec sao n\u00ean ch\u1ecdn Flask \u0111\u1ec3 x\u00e2y d\u1ef1ng API?<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-la-gi\"><strong>Flask l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>Flask l\u00e0 m\u1ed9t micro framework ph\u1ed5 bi\u1ebfn c\u1ee7a Python, th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng web v\u00e0 API. V\u1edbi Flask, l\u1eadp tr\u00ecnh vi\u00ean c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng t\u1ea1o ra c\u00e1c API RESTful \u0111\u1ec3 ph\u1ee5c v\u1ee5 cho c\u00e1c \u1ee9ng d\u1ee5ng ph\u1ea7n m\u1ec1m kh\u00e1c.<\/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\/flask-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Flask l\u00e0 g\u00ec? \u1ee8ng d\u1ee5ng c\u1ee7a Flask trong l\u1eadp tr\u00ecnh Python hi\u1ec7n \u0111\u1ea1i<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-api-rest-api-la-gi\"><strong>API (REST API) l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>API (Application Programming Interface) l\u00e0 m\u1ed9t t\u1eadp h\u1ee3p c\u00e1c \u0111\u1ecbnh ngh\u0129a v\u00e0 giao th\u1ee9c cho ph\u00e9p c\u00e1c \u1ee9ng d\u1ee5ng ph\u1ea7n m\u1ec1m giao ti\u1ebfp v\u1edbi nhau. API cung c\u1ea5p c\u00e1c \u0111i\u1ec3m truy c\u1eadp (endpoints) \u0111\u1ec3 c\u00e1c h\u1ec7 th\u1ed1ng c\u00f3 th\u1ec3 g\u1eedi y\u00eau c\u1ea7u (request) v\u00e0 nh\u1eadn ph\u1ea3n h\u1ed3i (respone) cho m\u1ed9t \u0111\u1ecbnh d\u1ea1ng nh\u1ea5t \u0111\u1ecbnh.<\/p>\n\n\n\n<p>REST API l\u00e0 m\u1ed9t ki\u1ec3u API tu\u00e2n theo nguy\u00ean t\u1eafc c\u1ee7a ki\u1ebfn tr\u00fac REST. N\u00f3 s\u1eed d\u1ee5ng giao th\u1ee9c HTTP \u0111\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c thao t\u00e1c nh\u01b0 l\u1ea5y d\u1eef li\u1ec7u (<code>GET<\/code>), t\u1ea1o m\u1edbi (<code>POST<\/code>), c\u1eadp nh\u1eadt (<code>PUT\/PATCH<\/code>) ho\u1eb7c xo\u00e1c (<code>DELETE<\/code>) t\u00e0i nguy\u00ean, th\u01b0\u1eddng \u0111\u01b0\u1ee3c bi\u1ec3u di\u1ec5n d\u01b0\u1edbi d\u1ea1ng JSON.\u00a0<\/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: <\/em><a href=\"https:\/\/itviec.com\/blog\/api-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong><em>API l\u00e0 g\u00ec? 4 \u0111\u1eb7c \u0111i\u1ec3m n\u1ed5i b\u1eadt c\u1ee7a API<\/em><\/strong><\/a><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-vi-sao-nen-ch\u1ecdn-flask-d\u1ec3-xay-d\u1ef1ng-api\"><strong>V\u00ec sao n\u00ean ch\u1ecdn Flask \u0111\u1ec3 x\u00e2y d\u1ef1ng API?<\/strong><\/h3>\n\n\n\n<p>Flask l\u00e0 l\u1ef1a ch\u1ecdn quen thu\u1ed9c c\u1ee7a nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean khi x\u00e2y d\u1ef1ng RESTful API cho c\u00e1c \u1ee9ng d\u1ee5ng quy m\u00f4 nh\u1ecf \u0111\u1ebfn v\u1eeba, nh\u1edd c\u00e1c \u01b0u \u0111i\u1ec3m sau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Microframework nh\u1eb9 v\u00e0 t\u1ed1i gi\u1ea3n: <\/strong>Cung c\u1ea5p \u0111\u00fang nh\u1eefng g\u00ec c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web ho\u1eb7c API, cho ph\u00e9p t\u1ea1o API nhanh ch\u00f3ng v\u1edbi c\u1ea5u h\u00ecnh t\u1ed1i thi\u1ec3u, gi\u00fap \u0111\u01a1n gi\u1ea3n h\u00f3a qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n.<\/li>\n\n\n\n<li><strong>C\u00f3 s\u1eb5n server ph\u00e1t tri\u1ec3n<\/strong>: Gi\u00fap d\u1ec5 d\u00e0ng ki\u1ec3m th\u1eed v\u00e0 debug API trong qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n.<\/li>\n\n\n\n<li><strong>H\u1ed7 tr\u1ee3 Jinja2<\/strong>: T\u00edch h\u1ee3p engine template m\u1ea1nh m\u1ebd \u0111\u1ec3 x\u00e2y d\u1ef1ng giao di\u1ec7n HTML ho\u1eb7c ph\u1ea3n h\u1ed3i JSON m\u1ed9t c\u00e1ch linh ho\u1ea1t.<\/li>\n\n\n\n<li><strong>\u0110\u1ed9 linh ho\u1ea1t cao<\/strong>: Kh\u00f4ng \u00e1p \u0111\u1eb7t c\u1ea5u tr\u00fac, d\u1ec5 d\u00e0ng tu\u1ef3 ch\u1ec9nh theo t\u1eebng d\u1ef1 \u00e1n, \u0111\u1ed9 linh ho\u1ea1t cao h\u01a1n c\u1ea3 c\u00e1c framework l\u1edbn nh\u01b0 Django.<\/li>\n\n\n\n<li><strong>Ki\u1ec3m so\u00e1t chi ti\u1ebft: <\/strong>Cho ph\u00e9p l\u1eadp tr\u00ecnh vi\u00ean \u201cl\u00e0m ch\u1ee7\u201d to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng m\u00e0 kh\u00f4ng b\u1ecb r\u00e0ng bu\u1ed9c b\u1edfi nh\u1eefng quy t\u1eafc khu\u00f4n m\u1eabu c\u1ed1 \u0111\u1ecbnh.<\/li>\n\n\n\n<li><strong>D\u1ec5 m\u1edf r\u1ed9ng<\/strong>: H\u1ed7 tr\u1ee3 nhi\u1ec1u th\u01b0 vi\u1ec7n v\u00e0 plugin b\u00ean th\u1ee9 ba nh\u01b0 x\u00e1c th\u1ef1c, k\u1ebft n\u1ed1i c\u01a1 s\u1edf d\u1eef li\u1ec7u,&#8230;<\/li>\n\n\n\n<li><strong>Th\u1eeba h\u01b0\u1edfng l\u1ee3i th\u1ebf l\u1edbn t\u1eeb c\u1ed9ng \u0111\u1ed3ng Python<\/strong>: C\u00f3 t\u00e0i nguy\u00ean m\u00e3 ngu\u1ed3n d\u1ed3i d\u00e0o, h\u1ed7 tr\u1ee3 hi\u1ec7u qu\u1ea3 cho vi\u1ec7c ph\u00e1t tri\u1ec3n API.<\/li>\n<\/ul>\n\n\n\n<p>Tuy nhi\u00ean, b\u1ea1n c\u0169ng c\u1ea7n c\u00e2n nh\u1eafc khi l\u1ef1a ch\u1ecdn Flask v\u00ec framework n\u00e0y c\u00f3 m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf sau:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ch\u1ee9c n\u0103ng gi\u1edbi h\u1ea1n<\/strong>: V\u00ec l\u00e0 microframework, Flask ch\u1ec9 cung c\u1ea5p nh\u1eefng th\u00e0nh ph\u1ea7n c\u01a1 b\u1ea3n. N\u1ebfu c\u1ea7n t\u00ednh n\u0103ng ph\u1ee9c t\u1ea1p, b\u1ea1n ph\u1ea3i t\u00edch h\u1ee3p th\u00eam th\u01b0 vi\u1ec7n ngo\u00e0i.<\/li>\n\n\n\n<li><strong>Kh\u00f3 m\u1edf r\u1ed9ng khi d\u1ef1 \u00e1n l\u1edbn<\/strong>: D\u1ec5 ti\u1ebfp c\u1eadn cho d\u1ef1 \u00e1n nh\u1ecf, nh\u01b0ng khi \u1ee9ng d\u1ee5ng m\u1edf r\u1ed9ng, vi\u1ec7c qu\u1ea3n l\u00fd ph\u1ee5 thu\u1ed9c v\u00e0 c\u1ea5u tr\u00fac d\u1ef1 \u00e1n c\u00f3 th\u1ec3 tr\u1edf n\u00ean ph\u1ee9c t\u1ea1p.<\/li>\n\n\n\n<li><strong>Kh\u00f4ng t\u00edch h\u1ee3p s\u1eb5n database<\/strong>: C\u1ea7n d\u00f9ng th\u00eam th\u01b0 vi\u1ec7n nh\u01b0 SQLAlchemy \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi c\u01a1 s\u1edf d\u1eef li\u1ec7u.<\/li>\n\n\n\n<li><strong>Ti\u1ec1m \u1ea9n r\u1ee7i ro b\u1ea3o m\u1eadt<\/strong>: Gi\u1ed1ng m\u1ecdi web framework kh\u00e1c, Flask c\u00f3 th\u1ec3 b\u1ecb t\u1ea5n c\u00f4ng (SQL injection, XSS&#8230;). L\u1eadp tr\u00ecnh vi\u00ean c\u1ea7n n\u1eafm r\u00f5 v\u00e0 c\u00f3 bi\u1ec7n ph\u00e1p b\u1ea3o m\u1eadt ph\u00f9 h\u1ee3p.<\/li>\n<\/ul>\n\n\n\n<p>Sau khi hi\u1ec3u r\u00f5 b\u1ea3n ch\u1ea5t v\u00e0 c\u00e1c \u01b0u &#8211; nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a Flask, b\u1ea1n c\u00f3 th\u1ec3 b\u1eaft tay v\u00e0o x\u00e2y d\u1ef1ng API \u0111\u01a1n gi\u1ea3n b\u1eb1ng framework n\u00e0y v\u1edbi h\u01b0\u1edbng d\u1eabn chi ti\u1ebft d\u01b0\u1edbi \u0111\u00e2y.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-h\u01b0\u1edbng-d\u1eabn-chi-ti\u1ebft-t\u1eebng-b\u01b0\u1edbc-t\u1ea1o-api-d\u1ea7u-tien-c\u1ee7a-b\u1ea1n-b\u1eb1ng-flask\"><span class=\"ez-toc-section\" id=\"Huong_dan_chi_tiet_tung_buoc_tao_API_dau_tien_cua_ban_bang_Flask\"><\/span><strong>H\u01b0\u1edbng d\u1eabn chi ti\u1ebft t\u1eebng b\u01b0\u1edbc t\u1ea1o API \u0111\u1ea7u ti\u00ean c\u1ee7a b\u1ea1n b\u1eb1ng Flask<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-1-ki\u1ec3m-tra-va-cai-d\u1eb7t-moi-tr\u01b0\u1eddng\"><strong>B\u01b0\u1edbc 1: Ki\u1ec3m tra v\u00e0 c\u00e0i \u0111\u1eb7t m\u00f4i tr\u01b0\u1eddng<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 t\u1ea1o API \u0111\u1ea7u ti\u00ean, tr\u01b0\u1edbc h\u1ebft h\u00e3y \u0111\u1ea3m b\u1ea3o b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t Python v\u00e0 pip tr\u00ean m\u00e1y t\u00ednh b\u1eb1ng c\u00e1ch ki\u1ec3m tra phi\u00ean b\u1ea3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ python --version\n\nPython 3.10.4\n\n$ pip --version\n\npip 22.0.4 from \/usr\/lib\/python3\/dist-packages\/pip (python 3.10)<\/code><\/pre>\n\n\n\n<p>N\u1ebfu m\u1ed9t trong hai l\u1ec7nh tr\u00ean kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng, b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp <a href=\"http:\/\/python.org\" target=\"_blank\" rel=\"noreferrer noopener\">python.org<\/a> \u0111\u1ec3 t\u1ea3i v\u00e0 c\u00e0i \u0111\u1eb7t Python (pip \u0111i k\u00e8m). Sau \u0111\u00f3, ti\u1ebfn h\u00e0nh c\u00e0i \u0111\u1eb7t Flask:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ pip install flask\n\nCollecting flask\n\n...\n\nSuccessfully installed Jinja2-3.1.1 MarkupSafe-2.1.1 Werkzeug-2.1.1 click-8.1.2 colorama-0.4.4 flask-2.1.1 itsdangerous-2.1.2<\/code><\/pre>\n\n\n\n<p>Ngo\u00e0i ra, b\u1ea1n n\u00ean s\u1eed d\u1ee5ng m\u00f4i tr\u01b0\u1eddng \u1ea3o (virtual environment &#8211; venv) \u0111\u1ec3 qu\u1ea3n l\u00fd th\u01b0 vi\u1ec7n d\u1ec5 d\u00e0ng h\u01a1n, tr\u00e1nh xung \u0111\u1ed9t gi\u1eefa c\u00e1c d\u1ef1 \u00e1n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>python -m venv .venv<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3, &#8220;<code>python -m venv .venv<\/code>&#8221; c\u00f3 t\u00e1c d\u1ee5ng t\u1ea1o m\u00f4i tr\u01b0\u1eddng \u1ea3o trong th\u01b0 m\u1ee5c .venv c\u1ee7a d\u1ef1 \u00e1n.\u00a0<\/p>\n\n\n\n<p>Sau khi t\u1ea1o .venv, b\u1ea1n c\u1ea7n k\u00edch ho\u1ea1t m\u00f4i tr\u01b0\u1eddng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tr\u00ean macOS \/ Linux:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>source .venv\/bin\/activate<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tr\u00ean Windows:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>.venv\\Scripts\\activate<\/code><\/pre>\n\n\n\n<p>Khi k\u00edch ho\u1ea1t xong, d\u00f2ng l\u1ec7nh s\u1ebd c\u00f3 ti\u1ec1n t\u1ed1 nh\u01b0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) $<\/code><\/pre>\n\n\n\n<p>Sau \u0111\u00f3 b\u1ea1n c\u00e0i Flask ho\u1eb7c b\u1ea5t k\u1ef3 th\u01b0 vi\u1ec7n n\u00e0o b\u1eb1ng pip. Khi n\u00e0y, ch\u00fang ch\u1ec9 t\u1ed3n t\u1ea1i trong .venv, kh\u00f4ng \u1ea3nh h\u01b0\u1edfng t\u1edbi h\u1ec7 th\u1ed1ng ho\u1eb7c m\u00f4i tr\u01b0\u1eddng kh\u00e1c.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-2-t\u1ea1o-file-chinh-app-py-va-vi\u1ebft-api-d\u1ea7u-tien\"><strong>B\u01b0\u1edbc 2: T\u1ea1o file ch\u00ednh app.py v\u00e0 vi\u1ebft API \u0111\u1ea7u ti\u00ean<\/strong><\/h3>\n\n\n\n<p>T\u1ea1o file app.py v\u00e0 th\u00eam \u0111o\u1ea1n m\u00e3 \u0111\u01a1n gi\u1ea3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/')\n\ndef hello():\n\n\u00a0\u00a0\u00a0\u00a0return {'message': 'Hello, World!'}\n\nif __name__ == '__main__':\n\n\u00a0\u00a0\u00a0\u00a0app.run(debug=True)<\/code><\/pre>\n\n\n\n<p>Trong terminal, ch\u1ea1y python app.py. N\u1ebfu ch\u1ea1y th\u00e0nh c\u00f4ng, Flask s\u1ebd hi\u1ec3n th\u1ecb d\u00f2ng: Running on http:\/\/127.0.0.1:5000\/.\u00a0<\/p>\n\n\n\n<p>Khi n\u00e0y, b\u1ea1n ti\u1ebfp t\u1ee5c truy c\u1eadp tr\u00ecnh duy\u1ec7t t\u1ea1i http:\/\/127.0.0.1:5000\/, b\u1ea1n s\u1ebd th\u1ea5y k\u1ebft qu\u1ea3:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JSON { \"message\": \"Hello, World!\" }<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"370\" height=\"152\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-8.png\" alt=\"\" class=\"wp-image-89269\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-8.png 370w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-8-300x123.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-8-200x82.png 200w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><\/figure>\n\n\n\n<p>Gi\u1ea3i th\u00edch:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Flask (__name__)<\/code>: Kh\u1edfi t\u1ea1o \u1ee9ng d\u1ee5ng Flask<\/li>\n\n\n\n<li><code>@app.route('\/')<\/code>: \u0110\u1ecbnh ngh\u0129a m\u1ed9t endpoint t\u1ea1i \u0111\u01b0\u1eddng d\u1eabn \/.<\/li>\n\n\n\n<li><code>debug=True<\/code>: Cho ph\u00e9p Flask t\u1ef1 \u0111\u1ed9ng reload khi c\u00f3 thay \u0111\u1ed5i m\u00e3, gi\u00fap d\u1ec5 d\u00e0ng ki\u1ec3m th\u1eed trong qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-3-xay-d\u1ef1ng-rest-api-v\u1edbi-ch\u1ee9c-nang-crud\"><strong>B\u01b0\u1edbc 3: X\u00e2y d\u1ef1ng REST API v\u1edbi ch\u1ee9c n\u0103ng CRUD<\/strong><\/h3>\n\n\n\n<p>Ti\u1ebfp theo, ta s\u1ebd t\u1ea1o m\u1ed9t REST API \u0111\u01a1n gi\u1ea3n h\u1ed7 tr\u1ee3 c\u00e1c thao t\u00e1c CRUD (Create &#8211; Read &#8211; Update &#8211; Delete) tr\u00ean m\u1ed9t danh s\u00e1ch \u0111\u1ed1i t\u01b0\u1ee3ng. \u0110\u00e2y l\u00e0 m\u00f4 h\u00ecnh ph\u1ed5 bi\u1ebfn trong ph\u00e1t tri\u1ec3n web v\u00e0 backend.<\/p>\n\n\n\n<p>\u0110\u1ea7u ti\u00ean, b\u1ea1n c\u1ea7n c\u1eadp nh\u1eadt app.py \u0111\u1ec3 t\u1ea1o danh s\u00e1ch \u0111\u01a1n gi\u1ea3n v\u00e0 th\u1ef1c hi\u1ec7n c\u00e1c thao t\u00e1c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from flask import Flask, jsonify, request\napp = Flask(__name__)\nitems = &#91;]\n\n@app.route('\/items', methods=&#91;'GET'])\ndef get_items():\n\u00a0\u00a0\u00a0\u00a0return jsonify(items)\n\n@app.route('\/items', methods=&#91;'POST'])\ndef add_item():\n\u00a0\u00a0\u00a0\u00a0data = request.get_json()\n\u00a0\u00a0\u00a0\u00a0items.append(data)\n\u00a0\u00a0\u00a0\u00a0return jsonify(data), 201\n\n@app.route('\/items\/&lt;int:index>', methods=&#91;'PUT'])\ndef update_item(index):\n\u00a0\u00a0\u00a0\u00a0data = request.get_json()\n\u00a0\u00a0\u00a0\u00a0items&#91;index] = data\n\u00a0\u00a0\u00a0\u00a0return jsonify(data)\n\n@app.route('\/items\/&lt;int:index>', methods=&#91;'DELETE'])\ndef delete_item(index):\n\u00a0\u00a0\u00a0\u00a0item = items.pop(index)\n\u00a0\u00a0\u00a0\u00a0return jsonify(item)\n\nif __name__ == '__main__':\n\n\u00a0\u00a0\u00a0\u00a0app.run(debug=True)<\/code><\/pre>\n\n\n\n<p>\u0110\u00e2y l\u00e0 m\u1ed9t REST API \u0111\u01a1n gi\u1ea3n s\u1eed d\u1ee5ng Flask, cho ph\u00e9p client qu\u1ea3n l\u00fd danh s\u00e1ch c\u00e1c m\u1ee5c th\u00f4ng qua c\u00e1c ph\u01b0\u01a1ng th\u1ee9c HTTP ti\u00eau chu\u1ea9n. V\u1edbi m\u1ed7i route \u0111\u00e3 t\u1ea1o, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00e1c ph\u01b0\u01a1ng th\u1ee9c kh\u00e1c nhau. C\u1ee5 th\u1ec3, c\u00e1c endpoint sau hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c h\u1ed7 tr\u1ee3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GET \/items &#8211; L\u1ea5y danh s\u00e1ch c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng<\/li>\n\n\n\n<li>POST \/items &#8211; T\u1ea1o m\u1edbi m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng<\/li>\n\n\n\n<li>PUT \/items\/&lt;index&gt; &#8211; C\u1eadp nh\u1eadt m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng<\/li>\n\n\n\n<li>DELETE \/items\/&lt;index&gt; &#8211; X\u00f3a m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng<\/li>\n<\/ul>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 g\u1ecdi API POST \u0111\u1ebfn endpoint\/items theo nhi\u1ec1u c\u00e1ch kh\u00e1c nhau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Curl -X POST\u00a0 http:\/\/127.0.0.1:5000\/items \\\n\n-H \"Content-Type: application\/json\" \\\n\n-d '{\"name\": \"B\u00fat bi\", \"price\": 12000}'<\/code><\/pre>\n\n\n\n<p>Sau khi b\u1ea1n g\u1ecdi th\u00e0nh c\u00f4ng API POST \u0111\u1ec3 th\u00eam item v\u00e0o danh s\u00e1ch, b\u1ea1n c\u00f3 th\u1ec3 ki\u1ec3m tra endpoint GET \/items t\u1ea1i \u0111\u1ecba ch\u1ec9: http:\/\/127.0.0.1:5000\/items, th\u00ec ph\u1ea3n h\u1ed3i JSON t\u1eeb GET \/items s\u1ebd l\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;{\"name\": \"B\u00fat bi\",\"price\": 12000}]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"122\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-9.png\" alt=\"\" class=\"wp-image-89270\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-9.png 390w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-9-300x94.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-9-200x63.png 200w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/figure>\n\n\n\n<p>Gi\u1edd b\u1ea1n mu\u1ed1n c\u1eadp nh\u1eadt l\u1ea1i item \u0111\u00f3 (\u1edf index 0):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X PUT http:\/\/127.0.0.1:5000\/items\/0 \\\n\n-H \"Content-Type: application\/json\" \\\n\n-d '{\"name\": \"B\u00fat m\u1ef1c\", \"price\": 15000}'<\/code><\/pre>\n\n\n\n<p>K\u1ebft qu\u1ea3 ph\u1ea3n h\u1ed3i JSON t\u1eeb GET \/items s\u1ebd l\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;{\"name\": \"B\u00fat m\u1ef1c\",\"price\": 15000}]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"410\" height=\"126\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-10.png\" alt=\"\" class=\"wp-image-89271\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-10.png 410w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-10-300x92.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-10-200x61.png 200w\" sizes=\"auto, (max-width: 410px) 100vw, 410px\" \/><\/figure>\n\n\n\n<p>Xo\u00e1 item t\u1ea1i index 0 (DELETE \/items\/0):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X DELETE http:\/\/127.0.0.1:5000\/items\/0<\/code><\/pre>\n\n\n\n<p>K\u1ebft qu\u1ea3 ph\u1ea3n h\u1ed3i JSON t\u1eeb GET \/items s\u1ebd l\u00e0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91; ]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"386\" height=\"100\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-11.png\" alt=\"\" class=\"wp-image-89272\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-11.png 386w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-11-300x78.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-11-200x52.png 200w\" sizes=\"auto, (max-width: 386px) 100vw, 386px\" \/><\/figure>\n\n\n\n<p>L\u01b0u \u00fd: \u0110\u00e2y ch\u1ec9 l\u00e0 v\u00ed d\u1ee5 \u0111\u01a1n gi\u1ea3n, danh s\u00e1ch items hi\u1ec7n \u0111ang \u0111\u01b0\u1ee3c l\u01b0u t\u1ea1m th\u1eddi trong b\u1ed9 nh\u1edb (RAM). Do \u0111\u00f3, m\u1ed7i khi b\u1ea1n kh\u1edfi \u0111\u1ed9ng l\u1ea1i (reset) server, to\u00e0n b\u1ed9 d\u1eef li\u1ec7u s\u1ebd b\u1ecb m\u1ea5t. V\u1edbi s\u1ea3n ph\u1ea9m th\u1ef1c t\u1ebf, c\u1ea7n l\u01b0u v\u00e0o c\u01a1 s\u1edf d\u1eef li\u1ec7u (database).<\/p>\n\n\n\n<p>V\u1edbi c\u1ea5u tr\u00fac n\u00e0y, b\u1ea1n \u0111\u00e3 s\u1eb5n s\u00e0ng \u0111\u1ec3 m\u1edf r\u1ed9ng API t\u00f9y theo \u0111\u1ed9 ph\u1ee9c t\u1ea1p mong mu\u1ed1n. Tuy nhi\u00ean, \u0111\u00e2y ch\u01b0a ph\u1ea3i l\u00e0 c\u1ea5u tr\u00fac t\u1ed1i \u01b0u cho quy m\u00f4 l\u1edbn, v\u00ec m\u1ed7i route c\u1ea7n nhi\u1ec1u x\u1eed l\u00fd ri\u00eang bi\u1ec7t v\u00e0 ch\u01b0a c\u00f3 t\u00ednh t\u1ed5 ch\u1ee9c ch\u1eb7t ch\u1ebd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-4-t\u1ed5-ch\u1ee9c-code-v\u1edbi-blueprint-nang-cao\"><strong>B\u01b0\u1edbc 4: T\u1ed5 ch\u1ee9c code v\u1edbi Blueprint (n\u00e2ng cao)<\/strong><\/h3>\n\n\n\n<p>Blueprint l\u00e0 m\u1ed9t th\u00e0nh ph\u1ea7n trong Flask ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t \u1ee9ng d\u1ee5ng Flask thu nh\u1ecf. Thay v\u00ec t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng m\u1edbi, Blueprint cho ph\u00e9p t\u00e1ch ri\u00eang t\u1eebng ph\u1ea7n ch\u1ee9c n\u0103ng r\u1ed3i t\u00edch h\u1ee3p v\u00e0o \u1ee9ng d\u1ee5ng ch\u00ednh. T\u00ednh n\u0103ng n\u00e0y r\u1ea5t h\u1eefu \u00edch khi x\u00e2y d\u1ef1ng nhi\u1ec1u phi\u00ean b\u1ea3n c\u1ee7a API ho\u1eb7c ph\u00e2n chia c\u00e1c nh\u00f3m ch\u1ee9c n\u0103ng trong c\u00f9ng m\u1ed9t \u1ee9ng d\u1ee5ng.<\/p>\n\n\n\n<p>\u0110\u1ec3 b\u1eaft \u0111\u1ea7u v\u1edbi Blueprint, b\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c b\u01b0\u1edbc sau:<\/p>\n\n\n\n<p>1. T\u1ea1o th\u01b0 m\u1ee5c blueprints \u0111\u1ec3 ch\u1ee9a c\u00e1c module.&nbsp;<\/p>\n\n\n\n<p>2. Trong th\u01b0 m\u1ee5c n\u00e0y, t\u1ea1o th\u01b0 m\u1ee5c con basic_endpoints v\u00e0 th\u00eam file_init_.py:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#blueprints\/basic_endpoints\/__init__.py\n\nfrom flask import Blueprint, jsonify\n\nbasic_bp = Blueprint('basic_bp', __name__)\n\n@basic_bp.route('\/')\n\ndef hello():\n\n\u00a0\u00a0\u00a0\u00a0return jsonify({'message': 'Hello from a Blueprint!'})<\/code><\/pre>\n\n\n\n<p>3. C\u1eadp nh\u1eadt main.py \u0111\u1ec3 \u0111\u0103ng k\u00fd blueprint n\u00e0y v\u00e0o \u1ee9ng d\u1ee5ng ch\u00ednh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from flask import Flask\n\nfrom blueprints.basic_endpoints import basic_bp\n\napp = Flask(__name__)\n\napp.register_blueprint(basic_bp)\n\nif __name__ == '__main__':\n\n\u00a0\u00a0\u00a0\u00a0app.run(debug=True)<\/code><\/pre>\n\n\n\n<p>Khi ch\u1ea1y main.py, b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp http:\/\/127.0.0.1:5000\/ v\u00e0 s\u1ebd th\u1ea5y JSON ph\u1ea3n h\u1ed3i nh\u01b0 c\u0169. Tuy nhi\u00ean, m\u00e3 ngu\u1ed3n \u0111\u00e3 \u0111\u01b0\u1ee3c t\u1ed5 ch\u1ee9c r\u00f5 r\u00e0ng h\u01a1n, d\u1ec5 m\u1edf r\u1ed9ng v\u00e0 d\u1ec5 b\u1ea3o tr\u00ec v\u1ec1 sau.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"377\" height=\"151\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-12.png\" alt=\"\" class=\"wp-image-89273\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-12.png 377w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-12-300x120.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-12-200x80.png 200w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-5-tuy-ch\u1ecdn-t\u1ea1o-giao-di\u1ec7n-html-d\u1ed9ng-v\u1edbi-jinja-template\"><strong>B\u01b0\u1edbc 5 (t\u00f9y ch\u1ecdn): T\u1ea1o giao di\u1ec7n HTML \u0111\u1ed9ng v\u1edbi Jinja Template<\/strong><\/h3>\n\n\n\n<p>Flask h\u1ed7 tr\u1ee3 Jinja template, cho ph\u00e9p l\u1eadp tr\u00ecnh vi\u00ean render c\u00e1c trang HTML \u0111\u1ed9ng thay v\u00ec ch\u1ec9 tr\u1ea3 v\u1ec1 JSON nh\u01b0 c\u00e1c API th\u00f4ng th\u01b0\u1eddng. Tr\u01b0\u1edbc ti\u00ean, h\u00e3y t\u1ea1o m\u1ed9t th\u01b0 m\u1ee5c t\u00ean l\u00e0 templates v\u00e0 m\u1ed9t file example.html:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- templates\/example.html -->\n\n&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n\n&lt;head>\n\u00a0\u00a0\u00a0\u00a0&lt;meta charset=\"UTF-8\">\n\u00a0\u00a0\u00a0\u00a0&lt;title>Jinja Template Example&lt;\/title>\n&lt;\/head>\n\n&lt;body>\n\u00a0\u00a0\u00a0\u00a0&lt;p>{{ top }}&lt;\/p>\n\u00a0\u00a0\u00a0\u00a0&lt;p>{{ bottom }}&lt;\/p>\n&lt;\/body>\n\n&lt;\/html><\/code><\/pre>\n\n\n\n<p>Trong template n\u00e0y, b\u1ea1n s\u1ebd th\u1ea5y hai bi\u1ebfn top v\u00e0 bottom \u0111\u01b0\u1ee3c \u0111\u1eb7t trong d\u1ea5u <code>{{ }}<\/code>. \u0110\u00e2y l\u00e0 c\u00fa ph\u00e1p \u0111\u1eb7c bi\u1ec7t c\u1ee7a Jinja d\u00f9ng \u0111\u1ec3 ch\u00e8n d\u1eef li\u1ec7u Python v\u00e0o HTML, cho ph\u00e9p n\u1ed9i dung hi\u1ec3n th\u1ecb linh ho\u1ea1t.<\/p>\n\n\n\n<p>Ti\u1ebfp theo, c\u1ea7n t\u1ea1o m\u1ed9t&nbsp; blueprint m\u1edbi \u0111\u1ec3 x\u1eed l\u00fd vi\u1ec7c render HTML t\u1eeb Jinja. T\u1ea1o th\u01b0 m\u1ee5c blueprints\/jinja_demo v\u00e0 th\u00eam file __init__.py nh\u01b0 sau:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># blueprints\/jinja_demo\/__init__.py\n\nfrom flask import Blueprint, render_template, request\n\njinja_bp = Blueprint('jinja_bp', __name__)\n\n@jinja_bp.route('\/jinja_template')\n\ndef jinja_example():\n\u00a0\u00a0\u00a0\u00a0top = request.args.get('top', 'Default Top Text')\n\u00a0\u00a0\u00a0\u00a0bottom = request.args.get('bottom', 'Default Bottom Text')\n\u00a0\u00a0\u00a0\u00a0return render_template('example.html', top=top, bottom=bottom)<\/code><\/pre>\n\n\n\n<p>\u0110\u1eebng qu\u00ean \u0111\u0103ng k\u00fd blueprint n\u00e0y trong file main.py:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># main.py\n\nfrom flask import Flask\n\nfrom blueprints.jinja_demo import jinja_bp\n\napp = Flask(__name__)\n\napp.register_blueprint(jinja_bp)\n\nif __name__ == '__main__':\n\u00a0\u00a0\u00a0\u00a0app.run(debug=True)<\/code><\/pre>\n\n\n\n<p>B\u00e2y gi\u1edd, b\u1ea1n c\u00f3 th\u1ec3 truy c\u1eadp v\u00e0o \u0111\u01b0\u1eddng d\u1eabn http:\/\/127.0.0.1:5000\/jinja_template?top=top_text&amp;bottom=bottom_text, b\u1ea1n s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c k\u1ebft qu\u1ea3 hi\u1ec3n th\u1ecb t\u01b0\u01a1ng \u1ee9ng nh\u01b0 sau:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"636\" height=\"137\" src=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-13.png\" alt=\"\" class=\"wp-image-89274\" srcset=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-13.png 636w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-13-300x65.png 300w, https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/image-13-200x43.png 200w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-6-ki\u1ec3m-th\u1eed-api\"><strong>B\u01b0\u1edbc 6: Ki\u1ec3m th\u1eed API<\/strong><\/h3>\n\n\n\n<p>Sau khi x\u00e2y d\u1ef1ng API, b\u1ea1n n\u00ean ti\u1ebfn h\u00e0nh ki\u1ec3m th\u1eed \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o c\u00e1c endpoint ho\u1ea1t \u0111\u1ed9ng \u0111\u00fang nh\u01b0 mong \u0111\u1ee3i. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 c\u00f4ng c\u1ee5 ph\u1ed5 bi\u1ebfn c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Postman ho\u1eb7c Insomnia<\/strong>: Giao di\u1ec7n tr\u1ef1c quan, d\u1ec5 s\u1eed d\u1ee5ng, h\u1ed7 tr\u1ee3 ki\u1ec3m th\u1eed c\u00e1c request HTTP nh\u01b0 <code>GET<\/code>, <code>POST<\/code>, <code>PUT<\/code>, <code>DELETE<\/code>.<\/li>\n\n\n\n<li><strong>curl: <\/strong>C\u00f4ng c\u1ee5 d\u00f2ng l\u1ec7nh nhanh g\u1ecdn, ti\u1ec7n cho m\u00f4i tr\u01b0\u1eddng terminal ho\u1eb7c khi vi\u1ebft script t\u1ef1 \u0111\u1ed9ng.<\/li>\n\n\n\n<li><strong>Mockoon<\/strong>: H\u1eefu \u00edch khi mock API &#8211; t\u1ee9c l\u00e0 gi\u1ea3 l\u1eadp ph\u1ea3n h\u1ed3i t\u1eeb backend trong khi backend th\u1ef1c t\u1ebf ch\u01b0a s\u1eb5n s\u00e0ng. R\u1ea5t ph\u00f9 h\u1ee3p khi frontend v\u00e0 backend ph\u00e1t tri\u1ec3n song song.<\/li>\n<\/ul>\n\n\n\n<p>Sau khi s\u1eed d\u1ee5ng Flask \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c endpoint ph\u1ee5c v\u1ee5 trao \u0111\u1ed5i d\u1eef li\u1ec7u qua giao th\u1ee9c HTTP, b\u1ea1n s\u1ebd t\u1ea1o ra m\u1ed9t Flask API. \u0110\u00e2y ch\u00ednh l\u00e0 m\u1ed9t RESTful API nh\u1eb9, d\u1ec5 tri\u1ec3n khai v\u00e0 ph\u00f9 h\u1ee3p cho nhi\u1ec1u lo\u1ea1i \u1ee9ng d\u1ee5ng, t\u1eeb web \u0111\u1ebfn mobile ho\u1eb7c h\u1ec7 th\u1ed1ng microservice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-so-sanh-di\u1ec3m-khac-bi\u1ec7t-gi\u1eefa-flask-api-va-cac-rest-api-khac-trong-python\"><span class=\"ez-toc-section\" id=\"So_sanh_diem_khac_biet_giua_Flask_API_va_cac_REST_API_khac_trong_Python\"><\/span><strong>So s\u00e1nh \u0111i\u1ec3m kh\u00e1c bi\u1ec7t gi\u1eefa Flask API v\u00e0 c\u00e1c REST API kh\u00e1c trong Python<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ngo\u00e0i Flask API, Python c\u00f2n bao g\u1ed3m nhi\u1ec1u REST API n\u1ed5i b\u1eadt kh\u00e1c nh\u01b0 Django REST, FastAPI, Pyramid, Falcon, Bottle, Eve, Sanic, Tornado, Hug. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u1ea3ng so s\u00e1nh t\u1ed5ng quan \u0111i\u1ec3m kh\u00e1c bi\u1ec7t gi\u1eefa Flask API v\u00e0 2 API \u0111i\u1ec3n h\u00ecnh kh\u00e1c l\u00e0 Django REST v\u00e0 FastAPI.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>REST API<\/strong><\/td><td><strong>Hi\u1ec7u su\u1ea5t<\/strong><\/td><td><strong>C\u1ed9ng \u0111\u1ed3ng<\/strong><\/td><td><strong>M\u1ee5c \u0111\u00edch<\/strong><\/td><\/tr><tr><td><strong>Django REST framework<\/strong><\/td><td>Trung b\u00ecnh v\u00ec c\u00f3 nhi\u1ec1u th\u00e0nh ph\u1ea7n v\u00e0 ph\u1ee5 thu\u1ed9c<\/td><td>C\u1ed9ng \u0111\u1ed3ng l\u1edbn<\/td><td>X\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng web full-stack c\u00f3 c\u1ea3 frontend v\u00e0 backend&nbsp;<\/td><\/tr><tr><td><strong>Flask RESTful<\/strong><\/td><td>Nh\u1eb9, nhanh<\/td><td>C\u1ed9ng \u0111\u1ed3ng l\u1edbn<\/td><td>X\u00e2y d\u1ef1ng API nh\u1eb9, t\u00e1ch bi\u1ec7t frontend\/backend<\/td><\/tr><tr><td><strong>FastAPI<\/strong><\/td><td>Nhanh, b\u1ea5t \u0111\u1ed3ng b\u1ed9<\/td><td>C\u1ed9ng \u0111\u1ed3ng \u0111ang ph\u00e1t tri\u1ec3n<\/td><td>X\u00e2y d\u1ef1ng API hi\u1ec7u su\u1ea5t cao<\/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-api\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Flask_API\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Flask API<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-co-phu-h\u1ee3p-d\u1ec3-vi\u1ebft-api-khong\"><strong>Flask c\u00f3 ph\u00f9 h\u1ee3p \u0111\u1ec3 vi\u1ebft API kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Flask l\u00e0 m\u1ed9t l\u1ef1a ch\u1ecdn tuy\u1ec7t v\u1eddi \u0111\u1ec3 x\u00e2y d\u1ef1ng API nh\u1edd v\u00e0o s\u1ef1 \u0111\u01a1n gi\u1ea3n, linh ho\u1ea1t v\u00e0 h\u1ec7 sinh th\u00e1i m\u1edf r\u1ed9ng phong ph\u00fa h\u1ed7 tr\u1ee3 c\u00e1c t\u00ednh n\u0103ng nh\u01b0 t\u1ea1o t\u00e0i li\u1ec7u, x\u00e1c th\u1ef1c v\u00e0 tri\u1ec3n khai.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-co-ph\u1ea3i-la-api-backend-khong\"><strong>Flask c\u00f3 ph\u1ea3i l\u00e0 API backend kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Flask ho\u00e0n to\u00e0n c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng l\u00e0m n\u1ec1n t\u1ea3ng backend \u0111\u1ec3 x\u00e2y d\u1ef1ng API, cung c\u1ea5p d\u1eef li\u1ec7u cho c\u00e1c \u1ee9ng d\u1ee5ng giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng ho\u1eb7c t\u00edch h\u1ee3p v\u1edbi d\u1ecbch v\u1ee5 b\u00ean th\u1ee9 ba (third-party service) nh\u01b0 \u1ee9ng d\u1ee5ng di \u0111\u1ed9ng (iOS, Android), h\u1ec7 th\u1ed1ng thanh to\u00e1n (Paypal, Stripe),&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-api-co-dung-d\u01b0\u1ee3c-trong-moi-tr\u01b0\u1eddng-production-khong\"><strong>Flask API c\u00f3 d\u00f9ng \u0111\u01b0\u1ee3c trong m\u00f4i tr\u01b0\u1eddng production kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Flask API c\u00f3 th\u1ec3 d\u00f9ng trong m\u00f4i tr\u01b0\u1eddng production, nh\u01b0ng c\u1ea7n m\u1ed9t s\u1ed1 c\u1ea5u h\u00ecnh v\u00e0 c\u00f4ng c\u1ee5 b\u1ed5 tr\u1ee3 \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o hi\u1ec7u n\u0103ng, b\u1ea3o m\u1eadt v\u00e0 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng. Nhi\u1ec1u c\u00f4ng ty l\u1edbn \u0111\u00e3 tri\u1ec3n khai h\u1ec7 th\u1ed1ng production v\u1edbi Flask nh\u1edd t\u00ednh linh ho\u1ea1t v\u00e0 d\u1ec5 m\u1edf r\u1ed9ng c\u1ee7a n\u00f3.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-flask-th\u01b0\u1eddng-d\u01b0\u1ee3c-dung-trong-nh\u1eefng-tr\u01b0\u1eddng-h\u1ee3p-nao\"><strong>Flask th\u01b0\u1eddng \u0111\u01b0\u1ee3c d\u00f9ng trong nh\u1eefng tr\u01b0\u1eddng h\u1ee3p n\u00e0o?<\/strong><\/h3>\n\n\n\n<p>Flask th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p nh\u01b0 x\u00e2y d\u1ef1ng RESTful API, ph\u00e1t tri\u1ec3n microservices, t\u1ea1o dashboard qu\u1ea3n tr\u1ecb, th\u1eed nghi\u1ec7m \u00fd t\u01b0\u1edfng (prototyping), v\u00e0 t\u00edch h\u1ee3p v\u1edbi m\u00f4 h\u00ecnh machine learning.<\/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>Qua b\u00e0i vi\u1ebft n\u00e0y, hy v\u1ecdng b\u1ea1n \u0111\u00e3 c\u00f3 c\u00e1i nh\u00ecn t\u1ed5ng quan v\u1ec1 Flask API v\u00e0 c\u00e1ch t\u1ea1o m\u1ed9t API \u0111\u1ea7u ti\u00ean ch\u1ec9 v\u1edbi v\u00e0i d\u00f2ng code. D\u00f9 ch\u1ec9 l\u00e0 m\u1ed9t micro framework, Flask v\u1eabn l\u00e0 l\u1ef1a ch\u1ecdn m\u1ea1nh m\u1ebd v\u00e0 linh ho\u1ea1t cho c\u1ea3 ng\u01b0\u1eddi m\u1edbi h\u1ecdc l\u1eabn c\u00e1c d\u1ef1 \u00e1n th\u1ef1c t\u1ebf quy m\u00f4 nh\u1ecf \u0111\u1ebfn v\u1eeba. N\u1ebfu b\u1ea1n \u0111ang t\u00ecm c\u00e1ch b\u1eaft \u0111\u1ea7u h\u00e0nh tr\u00ecnh l\u1eadp tr\u00ecnh backend b\u1eb1ng Python, th\u00ec Flask ch\u00ednh l\u00e0 b\u01b0\u1edbc kh\u1edfi \u0111\u1ea7u l\u00fd t\u01b0\u1edfng. H\u00e3y ti\u1ebfp t\u1ee5c h\u1ecdc h\u1ecfi v\u00e0 trau d\u1ed3i \u0111\u1ec3 \u201cr\u00e0nh ngh\u1ec1\u201d h\u01a1n v\u1edbi micro framework n\u00e0y nh\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Flask l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd \u0111\u1ec3 x\u00e2y d\u1ef1ng REST API m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 linh ho\u1ea1t. Flask \u0111\u00e1p \u1ee9ng hi\u1ec7u qu\u1ea3 c\u00e1c nhu c\u1ea7u t\u1eeb k\u1ebft n\u1ed1i v\u1edbi \u1ee9ng d\u1ee5ng web, mobile hay t\u00edch h\u1ee3p v\u1edbi h\u1ec7 th\u1ed1ng th\u1ee9 3,&#8230; Trong b\u00e0i vi\u1ebft n\u00e0y, h\u00e3y c\u00f9ng ITviec b\u1eaft \u0111\u1ea7u nh\u1eefng b\u01b0\u1edbc c\u01a1 b\u1ea3n [&hellip;]<\/p>\n","protected":false},"author":213,"featured_media":89267,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109],"tags":[],"class_list":["post-89204","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it"],"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 API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask - ITviec Blog<\/title>\n<meta name=\"description\" content=\"H\u1ecdc c\u00e1ch t\u1ea1o REST API v\u1edbi Flask ch\u1ec9 trong v\u00e0i b\u01b0\u1edbc. So s\u00e1nh \u01b0u nh\u01b0\u1ee3c \u0111i\u1ec3m gi\u1eefa Flask v\u00e0 c\u00e1c framework Python kh\u00e1c \u0111\u1ec3 ch\u1ecdn gi\u1ea3i ph\u00e1p ph\u00f9 h\u1ee3p.\" \/>\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-api-la-gi\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask\" \/>\n<meta property=\"og:description\" content=\"Flask l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd \u0111\u1ec3 x\u00e2y d\u1ef1ng REST API m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 linh ho\u1ea1t. Flask \u0111\u00e1p \u1ee9ng hi\u1ec7u qu\u1ea3 c\u00e1c nhu c\u1ea7u t\u1eeb k\u1ebft n\u1ed1i v\u1edbi \u1ee9ng d\u1ee5ng web, mobile\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/flask-api-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-10T08:09:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-10T08:09:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"421\" \/>\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=\"14 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask - ITviec Blog","description":"H\u1ecdc c\u00e1ch t\u1ea1o REST API v\u1edbi Flask ch\u1ec9 trong v\u00e0i b\u01b0\u1edbc. So s\u00e1nh \u01b0u nh\u01b0\u1ee3c \u0111i\u1ec3m gi\u1eefa Flask v\u00e0 c\u00e1c framework Python kh\u00e1c \u0111\u1ec3 ch\u1ecdn gi\u1ea3i ph\u00e1p ph\u00f9 h\u1ee3p.","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-api-la-gi\/","og_locale":"vi_VN","og_type":"article","og_title":"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask","og_description":"Flask l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd \u0111\u1ec3 x\u00e2y d\u1ef1ng REST API m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 linh ho\u1ea1t. Flask \u0111\u00e1p \u1ee9ng hi\u1ec7u qu\u1ea3 c\u00e1c nhu c\u1ea7u t\u1eeb k\u1ebft n\u1ed1i v\u1edbi \u1ee9ng d\u1ee5ng web, mobile","og_url":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-07-10T08:09:29+00:00","article_modified_time":"2025-07-10T08:09:32+00:00","og_image":[{"width":800,"height":421,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-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":"14 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/"},"author":{"name":"Linh Trao","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/6d1bcbfa05475cbc5a2eaf0727501a16"},"headline":"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask","datePublished":"2025-07-10T08:09:29+00:00","dateModified":"2025-07-10T08:09:32+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/"},"wordCount":3335,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/","url":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/","name":"Flask API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-scaled.png","datePublished":"2025-07-10T08:09:29+00:00","dateModified":"2025-07-10T08:09:32+00:00","description":"H\u1ecdc c\u00e1ch t\u1ea1o REST API v\u1edbi Flask ch\u1ec9 trong v\u00e0i b\u01b0\u1edbc. So s\u00e1nh \u01b0u nh\u01b0\u1ee3c \u0111i\u1ec3m gi\u1eefa Flask v\u00e0 c\u00e1c framework Python kh\u00e1c \u0111\u1ec3 ch\u1ecdn gi\u1ea3i ph\u00e1p ph\u00f9 h\u1ee3p.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/flask-api-la-gi\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/flask-api-la-gi\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/07\/flask-api-la-gi-scaled.png","width":800,"height":421,"caption":"flask api - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/flask-api-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 API l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn t\u1ea1o REST API nhanh ch\u00f3ng v\u1edbi Flask"}]},{"@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\/89204","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=89204"}],"version-history":[{"count":4,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89204\/revisions"}],"predecessor-version":[{"id":89275,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/89204\/revisions\/89275"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/89267"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=89204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=89204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=89204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}