Quản lý cấu hình và biến môi trường với python-dotenv

Viết thẳng mật khẩu database vào file .py rồi đẩy lên GitHub là một trong những lỗi tốn kém nhất mà lập trình viên mắc phải. Cách đúng là tách cấu hình ra khỏi code.

Đọc biến môi trường

import os

db_url = os.environ["DATABASE_URL"]        # thiếu -> báo lỗi ngay
debug  = os.getenv("DEBUG", "false")       # thiếu -> dùng mặc định

Với cấu hình bắt buộc, hãy dùng os.environ[...]: hỏng sớm và rõ ràng lúc khởi động vẫn tốt hơn lỗi bí ẩn giữa đêm.

File .env cho môi trường phát triển

pip install python-dotenv
# .env
DATABASE_URL=mysql://user:matkhau@localhost/mydb
API_KEY=sk-xxxxx
DEBUG=true
# settings.py
from dotenv import load_dotenv
import os

load_dotenv()                              # nạp .env vào biến môi trường

DATABASE_URL = os.environ["DATABASE_URL"]
API_KEY      = os.environ["API_KEY"]
DEBUG        = os.getenv("DEBUG", "false").lower() == "true"

Bước quan trọng nhất

# .gitignore
.env

Thêm .env vào .gitignore trước lần commit đầu tiên. Nếu đã lỡ đẩy lên, xóa file thôi là chưa đủ — hãy đổi ngay toàn bộ mật khẩu và khóa API đó, vì lịch sử Git vẫn còn lưu.

Chia sẻ cấu trúc mà không lộ giá trị

# .env.example  (file này ĐƯỢC commit)
DATABASE_URL=
API_KEY=
DEBUG=false

Đồng nghiệp mới chỉ cần copy thành .env rồi điền giá trị của họ.

Gom cấu hình vào một chỗ

from dataclasses import dataclass
import os

@dataclass(frozen=True)
class CauHinh:
    database_url: str
    api_key: str
    debug: bool = False

    @classmethod
    def tu_moi_truong(cls):
        return cls(
            database_url=os.environ["DATABASE_URL"],
            api_key=os.environ["API_KEY"],
            debug=os.getenv("DEBUG", "false").lower() == "true",
        )

cau_hinh = CauHinh.tu_moi_truong()

Trên server thật, đừng dùng file .env — hãy đặt biến môi trường qua systemd, Docker hoặc dịch vụ quản lý secret của nhà cung cấp. File .env chỉ nên phục vụ máy phát triển của bạn.

Lên đầu trang