0

Đọc file biến môi trường - Environment file (.env) bằng Python

image.png

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ụngkhô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.

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ệc raise 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
        
    • 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ó.
  • 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àm int() để đư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ài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí