Python Miljøvariabler: Sikker konfigurasjon og best praksis

«`html

Ønsker du å forbedre måten du administrerer konfigurasjonen din på? Lær hvordan du bruker miljøvariabler effektivt i Python.

Da jeg begynte å lære Python, utviklet jeg prosjekter for å praktisere det jeg hadde lært. En del av dette innebar å koble til databaser og utføre spørringer med Python. Dette krevde at jeg lagret databasekonfigurasjon og sensitiv informasjon som brukernavn og passord for autentisering.

Det var ikke lurt å hardkode slik sensitiv informasjon direkte inn i et Python-skript. Derfor lærte jeg å bruke konfigurasjonsfiler og miljøvariabler, i kombinasjon med Pythons innebygde moduler.

Nå, når jeg trenger å bruke sensitiv informasjon som passord og API-nøkler i applikasjonene mine, setter jeg dem som miljøvariabler og henter dem når det er nødvendig. I denne veiledningen vil jeg forklare hva miljøvariabler er og hvordan du jobber med dem i Python.

Hva er miljøvariabler?

Miljøvariabler er dynamiske verdier utenfor selve applikasjonen som lagrer konfigurasjonsdata, systeminnstillinger og lignende. De administreres vanligvis av operativsystemet eller applikasjonsmiljøet. Her er noen nøkkelegenskaper for miljøvariabler:

  • Navn-verdi-par: Miljøvariabler består av et unikt navn (også kjent som en nøkkel) og en tilhørende verdi.
  • Systemomfang: Miljøvariabler kan defineres på systemnivå, og dermed være tilgjengelige for alle prosesser som kjører på systemet. De kan også endres eller settes på applikasjonsnivå, og påvirker kun den spesifikke applikasjonen.
  • Dynamisk og foranderlig: Miljøvariabler kan endres mens applikasjonen kjører, noe som gir fleksibilitet.

Hvordan miljøvariabler er nyttige

Miljøvariabler har flere fordeler når det gjelder å håndtere konfigurasjon og sensitiv informasjon i Python-applikasjoner:

  • Adskillelse av ansvarsområder: Ved å lagre konfigurasjon utenfor koden, holdes konfigurasjonsadministrasjon adskilt fra applikasjonslogikken.
  • Sikkerhet: Sensitive data, som API-nøkler og databaselegitimasjon, kan lagres i miljøvariabler uten å eksponeres direkte i kildekoden. Dette reduserer risikoen for eksponering.
  • Fleksibilitet: Det er enkelt å oppdatere konfigurasjonsinnstillinger via miljøvariabler, ettersom endringer kan gjøres utenfor selve koden. Dette gjør det enkelt å tilpasse konfigurasjonen for forskjellige miljøer eller ved oppdatering av legitimasjon.

I de neste avsnittene vil vi undersøke hvordan du setter, får tilgang til og administrerer miljøvariabler i Python, og hvordan de bidrar til å forbedre konfigurasjonsadministrasjonen i dine prosjekter.

Hvordan sette miljøvariabler

Du kan sette miljøvariabler via kommandolinjen. Området for disse variablene gjelder kun for gjeldende økt, og de vedvarer ikke utenfor denne økten.

For Mac- eller Linux-brukere, kan du sette en miljøvariabel i gjeldende terminaløkt på denne måten:

export MY_VARIABLE=min_verdi

Hvis du bruker Windows, kan du sette en miljøvariabel midlertidig slik:

set MY_VARIABLE=min_verdi

Få tilgang til miljøvariabler i Python

Python tilbyr os-modulen for operativsystemrelatert funksjonalitet. `os.environ` er en ordbok som inneholder miljøvariabler. Navnene på variablene er nøklene i ordboken, og verdiene er de tilhørende verdiene.

Du får tilgang til verdien av en miljøvariabel ved å bruke navnet som en nøkkel, akkurat som du ville gjort med elementer i en vanlig ordbok.

Her er et par eksempler:

import os
print(os.environ['HOME'])
# Output: /home/balapriya
print(os.environ['USER'])
# Output: balapriya

Så langt, så bra. Men hva skjer hvis du prøver å hente verdien av en miljøvariabel som ikke er satt?

La oss prøve å få tilgang til `API_KEY` som vi ikke har satt enda:

print(os.environ['API_KEY'])

Som forventet får vi en KeyError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen os>", line 679, in __getitem__
KeyError: 'API_KEY'

Håndtering av nøkkelfeil

Du kan håndtere `KeyError` på følgende måte:

import os

try:
	api_key = os.environ['API_KEY']
	print(f'API_KEY er satt til: {api_key}')
except KeyError:
	print('API_KEY er ikke satt. Konfigurer den.')

Denne tilnærmingen vil ikke brått avslutte programmet når en `KeyError` oppstår. Isteden gir den en beskrivende feilmelding:

# Output
API_KEY er ikke satt. Konfigurer den.

Dermed vil vi vite at en nødvendig miljøvariabel ikke er konfigurert dersom resten av programmet ikke kjører som forventet.

Få tilgang til miljøvariabler ved å bruke `get()`-metoden

Du kan bruke ordbokens `get()`-metode for å hente verdien av en miljøvariabel. I stedet for å returnere en `KeyError`, vil `get()`-metoden returnere `None` hvis variabelen ikke finnes.

Å hente `NOT_SET`-variabelen som vi ikke har konfigurert vil returnere `None`:

print(os.environ.get('NOT_SET'))
# Output: None

Jeg foretrekker å utløse en `KeyError` når en miljøvariabel ikke er definert, istedenfor å la det passere eller lagre `None` som `get()`-metoden returnerer.

`get()`-metoden er derimot nyttig når vi kan angi en standardverdi for en bestemt miljøvariabel hvis den ikke er definert.

Her er et eksempel:

print(os.environ.get('HOME','/home/bruker'))
# Output: /home/balapriya

Hvordan administrere konfigurasjon med miljøvariabler

La oss se på noen praktiske eksempler der vi bruker miljøvariabler i applikasjonene våre.

Eksempel 1: Konfigurere databasetilkoblingsparametere

Anta at du ønsker å koble til en PostgreSQL-database fra Python. For å gjøre dette kan du installere og bruke `psycopg2`-tilkoblingen:

pip install psycopg2

I dette eksemplet bruker vi miljøvariabler til å konfigurere databasetilkoblingsparametrene. Hvis miljøvariablene ikke er satt, gir vi standardverdier som skal brukes.

import os
import psycopg2

# Hent databasekonfigurasjon fra miljøvariabler
db_host = os.environ.get('DB_HOST', 'localhost')
db_port = os.environ.get('DB_PORT', '5432')
db_user = os.environ.get('DB_USER', 'minbruker')
db_password = os.environ.get('DB_PASSWORD', 'mittpassord')

# Opprett en databaseforbindelse
try:
	connection = psycopg2.connect(
    	host=db_host,
    	port=db_port,
    	user=db_user,
    	password=db_password,
    	database="mydb"
	)
	print('Koblet til databasen!')
except Exception as e:
	print(f'Feil ved tilkobling til databasen: {e}')

Eksempel 2: Administrere API-nøkler

La oss se på et annet eksempel som involverer bruk av API-nøkler.

I tillegg til ChatGPT-grensesnittet kan du også bruke OpenAI API for å benytte OpenAI LLM-er i dine applikasjoner.

Når du registrerer deg for en OpenAI-konto, vil du (vanligvis se) noen gratis tidsbegrensede API-kreditter. Du kan finne API-nøkkelen din under Innstillinger > Vis API-nøkler.

Du kan bruke Open AI Python SDK og et rammeverk som LangChain til å bygge applikasjoner. For å gjøre dette, må du installere bibliotekene (i et virtuelt miljø) med `pip`:

pip install openai
pip install langchain 

Slik kan du sette `OPENAI_API_KEY` som en miljøvariabel:

import os
os.environ["OPENAI_API_KEY"]='din-api-nøkkel'

Du kan nå få tilgang til Open AI LLM-er i skriptet ditt slik:

from langchain.llms import OpenAI
model=OpenAI(model_name="gpt-3.5-turbo")

Hvordan endre miljøvariabler i Python

Du kan endre miljøvariabler i den gjeldende Python-prosessen ved å endre `os.environ`-ordboken fra `os`-modulen:

import os

# Endre en eksisterende miljøvariabel eller opprett en ny
os.environ['MY_VARIABLE'] = 'ny_verdi'

I Python kan du bruke `subprocess`-modulen til å opprette delprosesser fra eksisterende Python-skript. Dette er nyttig når du vil kjøre systemprogrammer i Python.

I det følgende eksemplet endrer vi `PATH`-miljøvariabelen ved å endre `os.environ`-ordboken. Deretter kjører vi `echo $PATH` som en delprosess:

import os
import subprocess

# Sett en tilpasset miljøvariabel for delprosessen
os.environ['PATH'] = '/tilpasset/sti'

# Kjør en delprosess som aksesserer PATH-miljøvariabelen
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'Delprosessens output: {output}')

Vi ser at `PATH` har verdien `/tilpasset/sti`:

# Output
/tilpasset/sti

Omfanget av de endrede miljøvariablene

Det er viktig å merke seg at disse oppdateringene av miljøvariabler er midlertidige, og kun gjelder for den gjeldende Python-prosessen. Endringene forkastes når skriptet avsluttes:

  • Gjeldende Python-prosess: Når du endrer en miljøvariabel ved hjelp av `os.environ` i et Python-skript, er endringen lokal for den gjeldende Python-prosessen. Det vil ikke påvirke andre kjørende prosesser eller fremtidige Python-økter.
  • Underordnede prosesser: Endringer i miljøvariabler som gjøres i den gjeldende Python-prosessen arves av underordnede prosesser som opprettes av skriptet. Hvis du for eksempel oppretter en underprosess fra et Python-skript, vil underprosessen ha tilgang til de endrede miljøvariablene (som vist i eksemplet).
  • Ikke systemomfattende: Miljøvariabler satt i et Python-skript vil ikke vedvare utenom utførelsen av det skriptet.

Hvis du trenger å gjøre permanente endringer i miljøvariabler på systemnivå, må du vanligvis gjøre dette ved å bruke operativsystemspesifikke metoder.

Hvordan laste inn `.env`-filer med `python-dotenv`

`python-dotenv`-biblioteket er en populær Python-pakke som forenkler prosessen med å laste inn miljøvariabler fra en `.env`-fil til et Python-prosjekt. Dette er spesielt nyttig når du har flere miljøer (for eksempel utvikling, produksjon) med forskjellige konfigurasjoner, og du ønsker å holde disse innstillingene adskilt fra kildekoden.

Installerer `python-dotenv`

For å bruke `python-dotenv`, må du installere det først. Du kan installere det – i et virtuelt miljø – ved å bruke `pip`, Python-pakkehåndtereren:

pip install python-dotenv

Laster inn miljøvariabler fra en `.env`-fil

Du kan nå opprette en `.env`-fil i prosjektets rotkatalog og fylle den med nøkkel-verdi-par, akkurat som vanlige miljøvariabler. La oss lage følgende `.env`-fil med plassholderverdier:

API_KEY=din_api_nøkkel_her
DB_PASSWORD=ditt_databasepassord_her

Du kan nå laste inn miljøvariablene fra `.env`-filen ved å bruke `python-dotenv` slik:

import os
from dotenv import load_dotenv

# Last miljøvariabler fra .env-filen
load_dotenv()

# Hent miljøvariablene
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")

# Skriv ut miljøvariablene
print(f"API-nøkkel: {api_key}")
print(f"Databasepassord: {database_password}")

Merk at vi har brukt `os.getenv(VARIABEL_NAVN)` for å hente verdiene av miljøvariablene. Dette er også en gyldig (og mindre vanlig) måte å få tilgang til miljøvariabler på.

Her er output:

API-nøkkel: din_api_nøkkel_her
Databasepassord: ditt_databasepassord_her

I dette eksemplet:

  • Vi bruker `load_dotenv()` for å laste miljøvariablene definert i `.env`-filen inn i det gjeldende miljøet.
  • Deretter bruker vi `os.getenv()` for å hente miljøvariablene: `API_KEY` og `DB_PASSWORD`.

Konklusjon

Og det var det hele! Jeg håper du har lært hvordan du administrerer konfigurasjon og sensitiv informasjon ved å bruke miljøvariabler i Python-applikasjoner. Vi har gått gjennom det grunnleggende om å sette og få tilgang til miljøvariabler, samt deres praktiske bruk ved konfigurering av applikasjoner.

Selv om miljøvariabler er nyttige for å skille konfigurasjon fra kildekoden, bør du lagre sensitive variabler som hemmeligheter i produksjonstilfeller. For å administrere hemmeligheter, anbefaler jeg å utforske verktøy som HashiCorp Vault eller AWS Secrets Manager.

«`