Cấu hình biến môi trường Python

Bất cứ khi nào bạn viết một ứng dụng, thuật toán hoặc đường dẫn dữ liệu, rất có thể bạn sẽ có một vài biến có thể khác nhau giữa các môi trường hoặc triển khai. Ví dụ: cơ sở dữ liệu bạn kết nối khi thử nghiệm cục bộ chắc chắn là cơ sở dữ liệu khác so với cơ sở dữ liệu bạn đang nhắm mục tiêu trong sản xuất. Do đó, tên hoặc địa chỉ cơ sở dữ liệu của bạn sẽ là một biến cấu hình

Quản lý các biến cấu hình như vậy là rất quan trọng; . Để có trải nghiệm phát triển tuyệt vời, việc thêm và đặt các biến cấu hình cũng phải dễ dàng và không gây khó khăn

Mặc dù cực kỳ quan trọng, quản lý cấu hình không được coi là hấp dẫn lắm. Trong bài viết này, tôi muốn thay đổi điều đó. Cụ thể, tôi muốn chỉ cho bạn cách hấp dẫn nhất theo quan điểm của tôi để quản lý cấu hình trong Python hiện đại. Bạn đã sẵn sàng chưa?

Vấn đề

Như đã nêu trong phần giới thiệu, bất cứ khi nào bạn viết một phần mềm lớn hơn, tại một thời điểm nào đó, bạn sẽ phải quản lý các biến cấu hình. Theo các biến cấu hình, tôi đề cập đến các biến có thể khác nhau giữa các môi trường hoặc có thể xác định hành vi của ứng dụng của bạn. Các ví dụ điển hình là địa chỉ cơ sở dữ liệu, cấp nhật ký, số lượng luồng đồng thời tối đa hoặc mã thông báo API chỉ đề cập đến một số

Để đặt các biến đó, bạn có một số tùy chọn. Ba trong số những cái phổ biến nhất là

  • Lưu trữ chúng dưới dạng hằng số trong mã. Tại đây, bạn có lợi thế là không phải làm bất cứ điều gì khi chạy ứng dụng hoặc kiểm tra vì mọi thứ đã được cấu hình sẵn. Nhược điểm lớn là nó cực kỳ không linh hoạt và không áp dụng được khi bạn triển khai ứng dụng của mình sang các môi trường khác nhau. Trên thực tế, làm điều này được coi là phản mẫu khi bạn kết hợp chặt chẽ giữa mã và cấu hình
  • Lưu trữ chúng trong một tệp cấu hình. Tại đây, bạn phải tải một tệp khi khởi động ứng dụng và gán giá trị cho các biến tương ứng. Cách tiếp cận này linh hoạt vì bạn có thể có các tệp khác nhau cho các môi trường khác nhau. Mặt khác, nó có thể yêu cầu rất nhiều mã soạn sẵn để thiết lập mọi thứ một cách độc đáo. Ngoài ra, khi nói đến thử nghiệm, có thể khó chịu khi giữ các tệp cấu hình giả để thiết lập các thử nghiệm của bạn
  • Lưu trữ chúng trong các biến môi trường. Tại đây, bạn phải tải từng biến môi trường riêng lẻ và gán các giá trị đã tải cho các biến mã tương ứng. Ưu & nhược điểm tương tự như được mô tả khi sử dụng tệp cấu hình. Mặc dù vậy, việc sử dụng các biến môi trường có thể linh hoạt hơn một chút trong khi yêu cầu viết nhiều mã hơn một chút

Như bạn có thể thấy, cả ba tùy chọn này đều có ưu và nhược điểm. Câu hỏi là bây giờ;

Ảnh của Brett Jordan trên BaptGiải pháp

Quản lý cấu hình trong Python thật dễ dàng khi bạn sử dụng thư viện Pydantic tuyệt vời. Pydantic đi kèm với một lớp có tên là BaseSettings cho phép bạn tạo các lớp cấu hình ứng dụng được xác định rõ ràng, kiểu gợi ý. Ngoài việc cung cấp cho cấu hình của bạn một cấu trúc rõ ràng và giao diện được xác định rõ ràng, lớp này sẽ tự động đọc các giá trị từ cả biến môi trường và tệp cấu hình. Do đó, tải cấu hình của bạn không yêu cầu viết bất kỳ mã bổ sung nào. Điều đó nghe có vẻ tuyệt vời phải không?

Cuối cùng, khi bạn xác định cấu hình của mình là một lớp Python tiêu chuẩn, bạn có thể gán các giá trị mặc định hợp lý cho các biến. Điều này có nghĩa là bạn không cần phải đặt rõ ràng mọi biến trong mọi môi trường nhưng luôn sẵn sàng nếu bạn muốn hoặc phải làm trong tương lai

Ví dụ cơ bản

Đó là rất nhiều thông tin trong một đoạn văn nhỏ. Vì vậy, hãy hít một hơi và xem xét một số mã ví dụ để nâng cao hiểu biết của chúng ta

Tôi đã làm gì ở đây? . Lớp này có ba biến cấu hình tier, log_level,user tất cả đều là chuỗi. Tier và log_level có giá trị mặc định được chỉ định trong khi biến người dùng phải được đặt rõ ràng. Cách đơn giản nhất để đặt giá trị là tạo một thể hiện của lớp như cfg = MediumConfig[user="hans.maulwurf", tier="stg"]. Không có gì rất ngoạn mục cho đến nay, chỉ đơn giản là Python

Tuy nhiên, điều thực sự tiện dụng là tùy chọn thứ hai để đặt biến bằng cách sử dụng biến môi trường. Đối với ví dụ đã cho, bạn thực hiện việc này bằng cách đặt các biến môi trường có cùng tên với các biến trong lớp MediumConfig có tiền tố là medium_, i. e. medium_tiermedium_log_level. Tiền tố là cần thiết vì biến env_prefix trong lớp con BaseSettings0 được đặt thành. Nếu bạn không muốn điều đó, bạn có thể bỏ nó đi. Nói chung, nên sử dụng tiền tố cho các biến env vì nó cho phép bạn tách các biến dành riêng cho ứng dụng của mình khỏi các biến khác

Tuy nhiên, có thể có các biến môi trường có tên mà bạn không thể kiểm soát rõ ràng, tôi. e. bạn không thể chỉ thêm tiền tố của mình vào tên của họ. Tuy nhiên, bạn vẫn muốn có thể tự động tải các biến đó. Đối với trường hợp đó, bạn có thể sử dụng lớp BaseSettings1. Ở đó, bạn gán một thể hiện của Trường cho một biến và đặt tham số env của nó thành tên biến môi trường tương ứng. Bạn có thể thấy điều đó từ biến user được lấy từ biến môi trường BaseSettings3. Lưu ý rằng tiền tố không được sử dụng ở đây

Cuối cùng, những gì bạn thấy từ ví dụ là bạn có thể kết hợp và kết hợp các cách bạn chỉ định giá trị của các biến của mình. Nếu một biến được chỉ định theo nhiều cách, e. g. một giá trị được truyền cho trình khởi tạo lớp và biến môi trường tương ứng được đặt, giá trị được truyền cho trình khởi tạo lớp được ưu tiên hoặc có mức độ ưu tiên cao hơn. Thứ tự ưu tiên này có thể được thay đổi và thậm chí mở rộng. Chúng ta hãy xem làm thế nào để làm điều đó trong phần tiếp theo

Ví dụ nâng cao

Cho đến bây giờ, chúng ta đã biết cách đặt các biến cấu hình của mình một cách rõ ràng bằng mã hoặc sử dụng các biến môi trường. Những gì chúng tôi chưa đề cập là cách thực hiện điều đó bằng cách sử dụng các tệp cấu hình. Để xem nó hoạt động như thế nào, chúng ta hãy xem một số mã

Điều gì đã xảy ra ở đây?

  • đã thêm khả năng tải các biến cấu hình từ tệp YAML,
  • đã thay đổi thứ tự ưu tiên để tệp cấu hình được ưu tiên hơn các biến môi trường,
  • và loại bỏ một cách đặt biến mà tôi chưa nói ở đây

Tôi đã làm điều đó như thế nào? . Phương thức này phải trả về một bộ có thể gọi được với mỗi cách có thể gọi được thực hiện một cách có thể để tải các biến cấu hình. Thứ tự mà bạn trả về các hàm có thể gọi được từ chức năng đó sẽ xác định mức độ ưu tiên khi tải từ nhiều nguồn khác nhau

Cụ thể để load 1 file YAML config mình đã implement hàm BaseSettings5. Hàm này tải một tệp YAML có tên là config. yml và giải tuần tự hóa nó thành một từ điển Python. Để sử dụng hàm này trong lớp cấu hình, tôi đã thêm nó làm một trong những giá trị trả về của hàm BaseSettings4. Để cung cấp cho các tệp cấu hình YAML mức độ ưu tiên cao hơn so với việc sử dụng các biến môi trường, tôi đã đặt BaseSettings5 trước giá trị có thể gọi BaseSettings8 trong tập hợp các giá trị trả về. Xong. Đối với tôi, nó không thể dễ dàng và sạch sẽ hơn thế

Lưu ý cuối cùng, việc tải các biến cấu hình không giới hạn ở việc tải các tệp YAML. Bạn có thể thêm bất cứ thứ gì có thể giải tuần tự hóa dữ liệu vào từ điển. Bạn thậm chí có thể nghĩ đến việc thêm một hàm tải cấu hình của mình từ kho lưu trữ thông số đám mây như AWS SSM, nhưng điều đó nằm ngoài phạm vi của bài viết này. Tôi chắc rằng bạn có thể tự tìm ra cách để làm điều đó. ]

Ảnh của Etienne Girardet trên BaptWrap Up

Trong bài viết này, tôi đã chỉ cho bạn cách sử dụng Pydantic và lớp BaseSettings để xác định và quản lý cấu hình ứng dụng của bạn. Sử dụng cái này ngay lập tức sẽ mang lại cho bạn giao diện được xác định rõ hơn và rõ ràng hơn cho cấu hình của bạn cũng như yêu cầu bạn viết và duy trì ít mã hơn. Ngoài ra, tôi đã chỉ cho bạn một cách cực kỳ dễ dàng và linh hoạt để mở rộng triển khai BaseSettings của bạn để có thể hoạt động với các nguồn khác như tệp cấu hình. Cùng với đó, bạn nên trang bị một bộ công cụ cho phép bạn quản lý các cấu hình của mình như một ông chủ. Đối với tôi, tất cả những gì thực sự gợi cảm phải không. -]

Cảm ơn bạn đã theo dõi bài đăng này và tôi hy vọng bạn thích nó và học được điều gì đó mới. Như mọi khi, vui lòng kết nối trên LinkedIn hoặc theo dõi tôi tại đây và để lại nhận xét bên dưới

Làm cách nào để đặt biến môi trường trong Python?

Với biến từ điển môi trường, giá trị của biến môi trường có thể được đặt bằng cách chuyển khóa trong từ điển và gán giá trị cho nó . Với setdefault, giá trị mặc định có thể được gán cho biến môi trường. Bỏ qua khóa và giá trị mặc định trong phương thức setdefault.

Là. env một tập tin cấu hình?

Trong trường hợp bạn vẫn đang thắc mắc tất cả những điều này có nghĩa là gì, thì có lẽ bạn chưa quen với. tập tin env. Đó thực sự là một tệp văn bản cấu hình đơn giản được sử dụng để xác định một số biến bạn muốn chuyển vào môi trường ứng dụng của mình.

Chủ Đề