Chuyển đến nội dung

Flask là gì? Hướng dẫn tạo web Python đầu tiên với Flask cho người mới

Flask là gì, khác Django và FastAPI ra sao? Hướng dẫn cài Flask 3.1, tạo ứng dụng web Python đầu tiên: route, template Jinja2, form, file tĩnh, chế độ debug và đưa ứng dụng lên server.

Flask là gì? Hướng dẫn tạo web Python đầu tiên với Flask cho người mới

Bạn đã học Python cơ bản, viết được vài script tự động hóa, và giờ muốn biến chúng thành một trang web để người khác dùng được qua trình duyệt. Con đường ngắn nhất thường là Flask, một framework web nhỏ gọn đến mức trang web đầu tiên chỉ cần khoảng 10 dòng code.

Bài viết giải thích Flask là gì, khi nào nên chọn Flask thay vì Django hay FastAPI, rồi hướng dẫn từng bước từ cài đặt, viết route, dùng template Jinja2, xử lý form cho đến đưa ứng dụng lên server.

Câu trả lời ngắn: Flask là một micro-framework mã nguồn mở để viết ứng dụng web bằng Python. Phiên bản mới nhất là Flask 3.1.3 (phát hành tháng 2/2026), yêu cầu Python 3.9 trở lên. Cài bằng pip install flask, viết file app.py, chạy flask --app app run --debug rồi mở http://127.0.0.1:5000.

Bốn bước chạy ứng dụng web Flask đầu tiên
Bốn bước để có trang web Flask đầu tiên chạy trên máy.

Tóm tắt nhanh

  • Flask nhỏ gọn, dễ học, chỉ có phần lõi (định tuyến, template, request), phần còn lại bạn tự chọn thư viện.
  • Luôn tạo môi trường ảo (venv) riêng cho từng dự án trước khi cài Flask.
  • Năm khái niệm cốt lõi: route, template, Jinja2, request, url_for/redirect.
  • Muốn có trang quản trị, ORM, đăng nhập sẵn thì Django tiện hơn; chỉ viết API hiệu năng cao thì xem FastAPI.
  • Không dùng flask run và chế độ debug trên server thật; hãy chạy bằng Gunicorn hoặc Waitress.

Mục lục

  1. Flask là gì
  2. Flask, Django hay FastAPI
  3. Cài đặt Flask
  4. Viết ứng dụng Flask đầu tiên
  5. Route và URL động
  6. Template Jinja2 và file tĩnh
  7. Xử lý form
  8. Đưa ứng dụng lên server
  9. Học gì tiếp theo
  10. Câu hỏi thường gặp
  11. Kết luận

Flask là gì

Flask do Armin Ronacher viết năm 2010, nay được nhóm mã nguồn mở Pallets phát triển cùng các thư viện anh em như Werkzeug (xử lý HTTP), Jinja2 (template) và Click (dòng lệnh). Flask được gọi là micro-framework không phải vì chỉ làm được web nhỏ, mà vì phần lõi được giữ tối giản: nó lo việc nhận yêu cầu từ trình duyệt, chuyển tới đúng hàm Python và trả kết quả về. Cơ sở dữ liệu, đăng nhập, gửi email… bạn tự chọn tiện ích mở rộng phù hợp.

Nhờ vậy Flask rất hợp để học cách một ứng dụng web vận hành, viết nhanh bản thử nghiệm (prototype), làm API nhỏ, bảng điều khiển nội bộ hay giao diện web cho mô hình AI. Pinterest, LinkedIn từng dùng Flask cho một số dịch vụ, và Flask vẫn nằm trong nhóm framework web Python được dùng nhiều nhất.

Màn hình máy tính hiển thị mã nguồn Python
Nếu đã quen Python, bạn có thể viết ứng dụng Flask ngay trong buổi học đầu tiên. Ảnh: MikeRun/Wikimedia Commons, CC BY-SA 4.0

Flask, Django hay FastAPI

So sánh ba framework web Python Flask, Django và FastAPI
Chọn framework theo loại dự án, không có lựa chọn tốt nhất cho mọi trường hợp.
  • Chọn Flask khi bạn mới học web, cần làm nhanh một ứng dụng nhỏ hoặc muốn tự quyết từng thành phần.
  • Chọn Django khi làm website lớn có nhiều bảng dữ liệu, cần trang quản trị và hệ thống tài khoản dựng sẵn.
  • Chọn FastAPI khi chủ yếu viết API JSON cho ứng dụng di động, frontend React/Vue hay dịch vụ AI, cần hiệu năng cao và tài liệu API tự sinh.

Kiến thức học được từ Flask (route, request, template) dùng lại được gần như nguyên vẹn khi chuyển sang hai framework còn lại.

Cài đặt Flask

Trước tiên, kiểm tra máy đã có Python 3.9 trở lên bằng lệnh python --version (trên macOS, Linux dùng python3). Người dùng Windows có thể cài Python từ python.org hoặc từ Microsoft Store.

  1. Tạo thư mục dự án và di chuyển vào đó:
    mkdir hello-flask
    cd hello-flask
  2. Tạo môi trường ảo để thư viện của dự án không lẫn với hệ thống:
    python -m venv .venv
  3. Kích hoạt môi trường ảo:
    # Windows (PowerShell)
    .venv\Scripts\Activate.ps1
    
    # macOS, Linux
    source .venv/bin/activate
  4. Cài Flask:
    pip install flask

Nếu gặp lỗi kiểu “No module named flask”, gần như chắc chắn bạn đang chạy Python ngoài môi trường ảo. Cách xử lý tương tự lỗi No module named openai: kích hoạt lại venv rồi cài lại thư viện.

Viết ứng dụng Flask đầu tiên

Tạo file app.py với nội dung:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def trang_chu():
    return "<h1>Xin chào từ Flask!</h1>"

Chạy ứng dụng ở chế độ debug:

flask --app app run --debug

Mở trình duyệt vào http://127.0.0.1:5000, bạn sẽ thấy dòng chữ “Xin chào từ Flask!”. Ở chế độ debug, mỗi khi bạn lưu file, Flask tự khởi động lại, và khi có lỗi, trình duyệt hiển thị chi tiết dòng code gây lỗi. Nhấn Ctrl + C trong cửa sổ dòng lệnh để dừng.

Trên macOS, nếu cổng 5000 bị tính năng AirPlay Receiver chiếm, hãy đổi cổng: flask --app app run --debug --port 8000.

Route và URL động

Năm khái niệm cốt lõi khi học Flask: route, render_template, Jinja2, request, url_for
Năm khái niệm cốt lõi đủ để viết phần lớn website nhỏ bằng Flask.

Mỗi route gắn một địa chỉ URL với một hàm Python. Bạn có thể lấy một phần của URL làm tham số:

@app.route("/xin-chao/<ten>")
def xin_chao(ten):
    return f"Xin chào {ten}!"

@app.route("/san-pham/<int:ma>")
def san_pham(ma):
    return f"Đây là sản phẩm số {ma}"

Truy cập /xin-chao/Phuc sẽ hiện “Xin chào Phuc!”. Phần <int:ma> bắt buộc tham số phải là số nguyên, nếu không Flask trả lỗi 404.

Template Jinja2 và file tĩnh

Viết HTML trong chuỗi Python nhanh chóng trở nên rối. Flask dùng Jinja2 để tách giao diện ra file riêng trong thư mục templates.

Cấu trúc thư mục của một dự án Flask: app.py, templates, static, venv
Flask tự tìm template trong thư mục templates và file tĩnh trong thư mục static.

Tạo file templates/index.html:

<!doctype html>
<html lang="vi">
<head>
  <meta charset="utf-8">
  <title>{{ tieu_de }}</title>
  <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
  <h1>{{ tieu_de }}</h1>
  <ul>
  {% for viec in danh_sach %}
    <li>{{ viec }}</li>
  {% endfor %}
  </ul>
</body>
</html>

Sửa hàm trang chủ trong app.py:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def trang_chu():
    viec_can_lam = ["Học Python", "Học Flask", "Làm website đầu tiên"]
    return render_template("index.html", tieu_de="Việc cần làm", danh_sach=viec_can_lam)

Cú pháp {{ ... }} chèn giá trị, {% ... %} dùng cho vòng lặp và điều kiện. Jinja2 tự escape ký tự HTML trong dữ liệu, giúp hạn chế lỗi bảo mật XSS. File CSS, JavaScript, ảnh đặt trong thư mục static và gọi bằng url_for('static', filename=...).

Xử lý form

Ví dụ một form đăng ký nhận tin đơn giản:

from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)
nguoi_dang_ky = []

@app.route("/dang-ky", methods=["GET", "POST"])
def dang_ky():
    if request.method == "POST":
        email = request.form.get("email", "").strip()
        if email:
            nguoi_dang_ky.append(email)
        return redirect(url_for("dang_ky"))
    return render_template("dang_ky.html", danh_sach=nguoi_dang_ky)

Và file templates/dang_ky.html có form gửi theo phương thức POST:

<form method="post">
  <input type="email" name="email" placeholder="Email của bạn" required>
  <button type="submit">Đăng ký</button>
</form>
<p>Đã có {{ danh_sach|length }} người đăng ký.</p>

Chuyển hướng (redirect) sau khi xử lý POST giúp tránh việc trình duyệt gửi lại form khi người dùng nhấn F5. Ở dự án thật, dữ liệu nên lưu vào cơ sở dữ liệu (SQLite, PostgreSQL qua tiện ích Flask-SQLAlchemy) và form nên có bảo vệ CSRF (tiện ích Flask-WTF).

Đưa ứng dụng lên server

Những việc nên và không nên khi triển khai ứng dụng Flask lên server
Server phát triển của Flask chỉ dùng trên máy cá nhân.

Lệnh flask run khởi động một server phát triển, không được thiết kế để chịu tải hay chống tấn công. Khi đưa lên mạng, hãy dùng một WSGI server:

pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 app:app

Trên Windows, Gunicorn không chạy được, bạn dùng Waitress: waitress-serve --port=8000 app:app. Phía trước nên đặt Nginx hoặc Caddy để phục vụ file tĩnh và bật HTTPS. Nếu không muốn tự quản lý máy chủ, các nền tảng như Render, Railway, PythonAnywhere hay Google Cloud Run đều chạy Flask tốt.

Trước khi triển khai, xuất danh sách thư viện để server cài đúng phiên bản:

pip freeze > requirements.txt

Học gì tiếp theo

  • Blueprint: chia ứng dụng lớn thành nhiều mô-đun (người dùng, bài viết, quản trị).
  • Flask-SQLAlchemy và Flask-Migrate: làm việc với cơ sở dữ liệu và quản lý thay đổi cấu trúc bảng.
  • Flask-Login: đăng nhập, đăng xuất, ghi nhớ phiên.
  • Trả về JSON: hàm trả về dict là Flask tự chuyển thành JSON, đủ để viết API cho ứng dụng di động.
  • Kiểm thử với pytest và app.test_client().

Một bài tập hay để luyện: biến script Python sẵn có thành ứng dụng web, ví dụ dựng giao diện web cho bảng quản lý tài chính cá nhân bằng Python.

Câu hỏi thường gặp

Flask có miễn phí không?
Có. Flask là phần mềm mã nguồn mở theo giấy phép BSD-3-Clause, dùng miễn phí cả cho dự án thương mại.

Học Flask cần biết gì trước?
Python cơ bản (biến, hàm, list, dict) và một chút HTML. Biết CSS, JavaScript sẽ giúp giao diện đẹp hơn nhưng không bắt buộc lúc đầu.

Flask có làm được website lớn không?
Được, nếu tổ chức code bằng Blueprint và chọn đúng tiện ích mở rộng. Tuy nhiên với website nhiều chức năng quản trị, Django thường giúp tiết kiệm thời gian hơn.

Flask có hỗ trợ async không?
Từ Flask 2.0, bạn có thể viết hàm xử lý dạng async def, nhưng Flask vẫn là framework WSGI. Ứng dụng cần xử lý rất nhiều kết nối đồng thời nên cân nhắc FastAPI hoặc Quart.

Vì sao thay đổi code mà trang không cập nhật?
Bạn chưa bật --debug nên server không tự khởi động lại. Với file CSS, thử nhấn Ctrl + F5 để xóa bộ nhớ đệm trình duyệt.

Kết luận

Flask là điểm khởi đầu nhẹ nhàng nhất để bước từ Python sang lập trình web: cài đặt trong vài phút, trang đầu tiên chỉ vài dòng code, và mọi khái niệm bạn học đều dùng lại được khi chuyển sang Django hay FastAPI. Hãy bắt đầu bằng một dự án nhỏ bạn thật sự cần, như danh sách việc cần làm hay trang ghi chép chi tiêu, rồi bổ sung dần cơ sở dữ liệu, đăng nhập và triển khai lên server.

Bình luận

Chưa có bình luận nào. Bạn có câu hỏi hay kinh nghiệm riêng về chủ đề này? Hãy là người mở đầu.

Chia sẻ ý kiến của bạn

Email không hiển thị công khai. Bình luận đầu tiên của bạn sẽ hiện sau khi được duyệt.