Ga naar inhoud

Configuratie

Starlette moedigt een strikte scheiding van configuratie en code aan volgens het patroon met twaalf factoren.

Configuraties moeten worden opgeslagen in omgevingsvariabelen of in .env-bestanden die niet zijn vastgelegd voor bronbeheer.

Vanuit sqlalchemy importeren create _ engine
Starlette.applicaties importeren vanuit Starlette
Config importeren vanuit starlette.config
Van starlette.datastructuren import CommaSeparatedStrings, Geheim

# Config zal worden gelezen uit omgevingsvariabelen en / of ".env" bestanden.
Config = Config (".env")

DEBUG = config ('DEBUG', cast = bool, standaard = False)
DATABASE _ URL = configuratie ('DATABASE _ URL')
SECRET _ KEY = config ('SECRET _ KEY', cast = Geheim)
TOEGESTAAN _ HOSTS = config ('TOEGESTAAN _ HOSTS', cast=CommaSeparatedStrings)

App = Starlette (debug = DEBUG)
Engine = aanmaken _ engine (DATABASE _ URL)
...


# Leg dit niet vast aan broncontrole.
# Bijv. ".env" opnemen in je `.gitignore` bestand.
DEBUG = Waar
DATABASE _ URL = postgresql: / / gebruiker: password@localhost: 5432 / database
GEHEIM _ KEY=43n080musdfjt54t-09sdgr
TOEGESTAAN _ HOSTS = 127.0.0.1, localhost

prioriteit configureren

De leesvolgorde van de configuratiewaarden is:

  • Van omgevingsvariabelen.
  • uit het .env bestand. De standaardwaarde gegeven door* in config.

Als geen van deze overeenkomsten overeenkomt, zal config(...) een fout veroorzaken.

Geheim

Voor gevoelige toetsen is de Secret-klasse handig omdat het helpt de kans te minimaliseren dat de waarde die het bezit zou kunnen lekken in backtracking of andere code-introspectie.

Om de waarde van een Secret-instantie te krijgen, moet deze expliciet worden geconverteerd naar een tekenreeks. U moet dit alleen doen waar de waarde wordt gebruikt.

> > > instellingen importeren vanuit mijnproject
> > > instellingen.GEHEIM _ SLEUTEL
Geheim ('* * * * * * * * *')
> > > str (instellingen.SECRET _ KEY)
'98N349 $% 8b8-7yjn0n8y93T $23r'

Een

Je kan DatabaseURL van databases gebruiken Pakket hier Om database-URL 's op te slaan en te voorkomen dat ze in de logboeken lekken.

Komma gescheiden string

Het CommaSeparatedStrings-type is handig voor het bewaren van meerdere inhoud in één configuratiesleutel.

> > > instellingen importeren vanuit mijnproject
> > > print (instellingen.TOEGESTAAN _ HOSTS)
CommaSeparatedStrings (['127.0.0.1', 'localhost'])
> > > print (lijst (instellingen TOEGESTAAN _ HOSTS))
['127.0.0.1', 'localhost']
> > > afdrukken (len (settings.ALLOWED _ HOSTS))
2
> > > afdrukken (instellingen.ALLOWED _ HOSTS [0])
'127.0.0.1'

De omgeving lezen of aanpassen

In sommige gevallen wilt u omgevingsvariabelen programmatisch lezen of wijzigen. Dit is vooral handig bij het testen, waarbij u mogelijk specifieke sleutels in uw omgeving wilt overschrijven.

U moet de environ-instantie van Starlette gebruiken in plaats van te lezen of te schrijven vanuit os.environ. Deze instantie wordt toegewezen aan de standaard os.environ en biedt u extra bescherming door een fout te veroorzaken als u omgevingsvariabelen instelt nadat de configuratie ze heeft gelezen.

Als u pytest gebruikt, kunt u elke initiële omgeving in tests/conftest.py instellen.

Van starlette.config importeren environ

Environ ['DEBUG'] = 'WAAR'

Vooraf ingestelde omgevingsvariabelen lezen

U kunt omgevingsvariabelen een naam geven door de parameter env_prefix in te stellen.

Os importeren

Config importeren vanuit starlette.config

Os.environ ['APP _ DEBUG'] = 'ja'
Os.environ ['MILIEU'] = 'ontwikkeling'

Config = Config (env _ prefix = 'APP _')

DEBUG = config ('DEBUG') # zoekt APP _ DEBUG, geeft "ja" terug
ENVIRONMENT = config ('ENVIRONMENT') # lookups APP _ ENVIRONMENT, verhoogt KeyError als variabele is niet gedefinieerd

Een compleet voorbeeld

Het bouwen van grote applicaties kan complex zijn. U moet configuratie en code goed scheiden, databases isoleren tijdens het testen, afzonderlijke test- en productiedatabases gebruiken, enzovoort.

Hier bekijken we een compleet voorbeeld dat laat zien hoe we kunnen beginnen met het bouwen van een applicatie.

Laten we eerst onze setup, onze database- en tabeldefinitie en onze applicatielogica scheiden:

Config importeren vanuit starlette.config
Geheime import van starlette.datastructuren

Config = Config (".env")

DEBUG = config ('DEBUG', cast = bool, standaard = False)
SECRET _ KEY = config ('SECRET _ KEY', cast = Geheim)

DATABASE _ URL = configuratie ('DATABASE _ URL')


Sqlalchemie invoeren

# Database tabel definities.
Metagegevens = sqlalchemie. MetaData ()

Organisaties = sqlalchemie. Tabel (
    ...
)


Starlette.applicaties importeren vanuit Starlette
Middleware importeren vanuit starlette.middleware
Vanaf starlette.middleware.sessies importeren SessionMiddleware
Van starlette. routing importeren Route

Vanuit myproject-importinstellingen


Async def homepage (aanvraag):
    ...

Routes = [
    Route ("/", eindpunt = startpagina)
]

Tussenwerk = [
    Tussenwerk (
        SessieMiddleware,
        geheime _ sleutel = instellingen.GEHEIME _ SLEUTEL,
    )
]

App = Starlette (debug = instellingen. DEBUG, routes = routes, middleware=middleware)

Laten we nu onze testconfiguratie behandelen. We willen elke keer dat de testsuite wordt uitgevoerd een nieuwe testdatabase maken en deze verwijderen nadat de test is voltooid. We willen er ook voor zorgen dat

Van starlette.config importeren environ
Vanaf starlette.testclient importeren TestClient
Vanuit sqlalchemy importeren create _ engine
Vanuit sqlalchemy _ utils import create _ database, database _ bestaat, drop _ database

# Deze regel geeft een foutmelding als we deze gebruiken nadat 'settings' is geïmporteerd.
Environ ['DEBUG'] = 'WAAR'

Vanuit myproject-importinstellingen
App importeren uit myproject.app
Uit myproject.tables metadata importeren


@ Pytest.fixture (automatisch = Waar, scope = "sessie")
Def setup _ test _ database ():
    """
    Maak elke keer dat de tests worden uitgevoerd een schone testdatabase.
    """
    Url = instellingen.DATABASE _ URL
    Motor = aanmaken _ engine (url)
    Beweren niet database _ bestaat (url), 'Testdatabase bestaat al. Afbreken van tests.'
    create _ database (url) # De testdatabase maken.
    Metadata. create _ all (engine) # De tabellen maken.
    Opbrengst # Voer de tests uit.
    drop _ database (url) # Laat de testdatabase vallen.


@ pytest.armatuur ()
Def cliënt ():
    """
    Maak een 'client' -armatuur beschikbaar om cases te testen.
    """
    # Ons armatuur wordt gemaakt binnen een contextmanager. Dit zorgt ervoor dat
    # De toepassingslevensduur loopt voor elke testcase.
    Met TestClient (app) als test _ client:
        Opbrengst test _ opdrachtgever