Đọc file biến môi trường - Environment file (.env) bằng Python
File môi trường - Environment file là gì?
Tình hình hiện tại
- Bạn đang có những thông tin cần được bảo mật được đặt trong code của bạn (chẳng hạn như thông tin kết nối đến database)
Giờ vấn đề xảy ra là gì?
- Khi bạn đưa code của bạn lên trên mạng, một số người (hoặc bot) có thể đọc được code của bạn và lấy những thông tin quan trọng này.
- Hoặc những môi trường khác nhau, bạn phải sửa code để kết nối với các cơ sở dữ liệu khác nhau (cở sở dữ liệu dưới máy tính bạn hoặc trên server)
Giải pháp ở đây là gì?
- File môi trường - Environment file (.env) có thể giải quyết được những vấn đề trên.
- Về cơ bản enviroment file là một tệp văn bản chứa các biến môi trường được dùng để cấu hình ứng dụng mà không cần ghi trực tiếp vào mã nguồn.
Cấu trúc enviroment file có gì?
-
Ví dụ về một env file
# Đây là file .env ví dụ DEBUG=True PORT=8000 DATABASE_URL=postgresql://user:password@localhost:5432/mydb SECRET_KEY=sieu_mat_khau
-
Cấu trúc file
- Mỗi dòng là một biến môi trường theo dạng:
TÊN_BIẾN=giá_trị
- Không có dấu cách quanh dấu
=
- Dòng bắt đầu bằng
#
là comment.
- Mỗi dòng là một biến môi trường theo dạng:
Cách đọc file này trong Python
#1. Cài đặt thư viện python-dotenv
- Bạn truy cập link này để xem chi tiết về thư viện này nhé.
- Cài đặt bằng lệnh
pip install python-dotenv
#2. Đọc file .env
from dotenv import load_dotenv
load_dotenv('Đường dẫn đến file enviroment')
-
Về mặc định
load_dotenv()
sẽ đọc file .env ngang cấp với file python đang chạy..env main.py
-
Bạn có thể kết hợp các thư viện như Pathlib hoặc os để lấy đường dẫn file đúng.
-
Ví dụ với Django. Mình để file .env bên ngoài folder source code
.env src/ manage.py ...
-
Trong file settings.py đã có sẵn BASE_DIR là đường dẫn đến folder src/. Giờ mình sẽ đọc file môi trường như sau:
ENV_FILE_DIR = BASE_DIR / '../.env' # ../ là để lùi ra ngoài 1 cấp thư mục load_dotenv(ENV_FILE_DIR)
-
-
Sau khi chạy lệnh hàm
load_dotenv()
sẽ trả về kiểu bool để thông báo việc load này có thành công hay không ➡️ Vì thế mình có thể kết hợp việcraise Exception
để dừng chương trình lại nếu việc load này không thành công.if not load_dotenv(): raise FileNotFoundError('Environment file not found')
#3. Đọc biến trong enviroment file
-
Giờ bạn có thể dùng thư viện os để đọc biến này.
-
Có 2 cách để đọc
-
Dùng hàm
getenv()
: Không gây exception dừng server ➡️ Dùng cho biến môi trường có cũng được, không có cũng chẳng sao 🫠 hoặc chỉ định giá trị mặc định nếu không lấy được.db_url = os.getenv("DATABASE_URL", "Giá trị mặc định")
- Khi không lấy được
DATABASE_URL
từ môi trường sẽ trả về"Giá trị mặc định"
- Nếu bạn không cài đặt giá trị mặc định thì sẽ trả về None
db_url = os.getenv("DATABASE_URL") # Nếu không có sẽ trả về None
- Khi không lấy được
-
Dùng attribute
environ
. Có thể gây Exception dừng server ➡️ Dùng cho những biến môi trường quan trọng, bạn không muốn server mình tiếp tục chạy khi không có nó 🤕db_url = os.environ["DATABASE_URL"]
- Vì attribute
environ
là một mở rộng của dict nên khi không lấy được giá trị thì sẽ "quăng" exception KeyError và chương trình sẽ phải dừng lại nếu không try nó.
- Vì attribute
-
-
Lưu ý quan trọng:
- Tất cả dữ liệu được đọc từ biến môi trường ra đều là kiểu chuỗi
str
. Nên đôi khi bạn cần phải dùng hàmint()
để đưa về dạng số hoặc dùng lệnh so sánh nhưos.environ['DEBUG'].lower() == 'true'
để đưa về dạng đúng/sai.
- Tất cả dữ liệu được đọc từ biến môi trường ra đều là kiểu chuỗi
Tài liệu tham khảo
All rights reserved