Konfiguration
Starlette fördert die strikte Trennung von Konfiguration und Code nach dem 12-Faktor-Modus.
Die Konfiguration sollte in einer Umgebungsvariable oder in einer .env-Datei gespeichert werden, die nicht an die Quellcodeverwaltung übergeben wurde.
from sqlchemy import create_engine ()[Bearbeiten]
von starlette. applications import Starlette
from starlette. config import Config (Eingabetaste)
from starlette. datastructures import ComaSeparatedStrings, Secret (Deutsche Übersetzung)
#Config wird von Umgebungsvariablen und/oder ". env"-Dateien gelesen.
config = Config (". env") Bearbeiten
DEBUG = config ('DEBUG', cast = bool und default = False)
DATABASE_URL = config ('DATASE_URL')
SECRET_KEY = config ('SECRET_KEY', cast = geheim)
ALLOWED_HOSTS = config ('ALLOWED_HOSTS', cast = CommaSeparatedStrings) und
Startseite/debug (debug = debug)
engine = create_engine (DATABASE_URL) Bearbeiten
...
Don't commit this to source control (Machen Sie dies nicht zur Quellkontrolle)
Include ". env" in Ihrer `.gitignore` Datei.
debug = wahr
DATABASE_URL = postgresql://Benutzer: password @ localhost: 5432/database
SECRET_KEY = 43n080musdfjt54t-09sdgr
ALLOWED_HOSTS = 127.0.0.1 für localhost
Priorisierung der Bereitstellung
Die Reihenfolge, in der der Wert gelesen wird, ist:
- von den Umweltvariablen.
- vom
.envDokumenten. Der Standardwert von* inconfig.
Wenn keine davon übereinstimmt, gibt config(...) einen Fehler aus.
Geheim
Für sensible Schlüssel ist die Secret-Klasse nützlich, da sie dazu beiträgt, Situationen zu minimieren, in denen ihre Werte in Backtracking oder andere Introspektion des Codes verloren gehen können.
Um einen Wert von einer Secret-Instanz zu erhalten, muss er explizit in eine Zeichenfolge konvertiert werden.
>>> from myproject import settings <<Eingabeaufforderung>
>>> Einstellungen. SECRET_KEY
Geheimnis ('*******)
str (settings. SECRET_KEY)(Einstellungen)
'98n349$8b8 - 7yjn0n8y93T$23r' für $8b8 - 7yjn0n8y93T
Andeutet
Sie können DatabaseURL von databases verwenden
Package hier herunterladen
Sie speichern URLs und entfernen sie aus den Logos.
Kommas trennen Buchstaben.
Der CommaSeparatedStrings-Typ ist nützlich, um mehrere Dinge in einem einzigen Konfigurationsschlüssel unterzubringen.
>>> from myproject import settings <<Eingabeaufforderung>
>>> print (settings. ALLOWED_HOSTS)(Einstellungen. ALLOWED_HOSTS)
CommaSeparatedStrings (VHS '127.0.0.1',' localhost'])
>>> print (list (settings. ALLOWED_HOSTS))[Bearbeiten | Quelltext bearbeiten]
Hochhaus '127.0.0.1',' localhost']
>>> print (len (settings. allowed_HOSTS))(Übersetzung)
2
>>> print (settings. ALLOWED_HOSTS [0])[Bearbeiten | Quelltext bearbeiten]
'127.0.0.1'
Umgebung lesen oder ändern.
In einigen Fällen möchten Sie möglicherweise Umgebungsvariablen programmgesteuert lesen oder ändern, was besonders in Tests nützlich ist, in denen Sie möglicherweise bestimmte Schlüssel in Ihrer Umgebung überschreiben möchten.
Sie sollten Starlette verwenden. environ Beispiele, nicht aus os.environ Lesen oder Schreiben erfolgt für diese Instanz auf den Standard zugeordnet. os.environ Wenn die Konfiguration eine Umgebungsvariable festgelegt hat, nachdem sie gelesen wurde, bietet die Instanz zusätzlichen Schutz, indem sie einen Fehler auslöst.
Wenn Sie pytest verwenden, können Sie eine beliebige Startumgebung in tests/conftest.py einrichten.
from starlette. config import environ (englisch)
[[Kategorie: Hochhaus | Hochhaus]]="Wahrheit"
Auslesen von Umgebungsvariablen mit Präfix
Sie können Umgebungsvariablen in Namespaces unterteilen, indem Sie den env_prefix-Parameter setzen.
Importieren Sie uns
from starlette. config import Config (Eingabetaste)
[[Kategorie: Windschutzt-App]]="Ja"
os. environ 'ENVIRONMENT']='dev'
config = Config (env_prefix ='APP_')[Bearbeiten]
DEBUG = config ('DEBUG')#lookups APP_DEBUG, returns "yes"("Rückruf")
ENVIRONMENT = config ('ENVIRONMENT')#lookups APP_ENVIRONMENT, raises KeyError as variable is not defined
Ein komplettes Beispiel
Das Erstellen großer Anwendungen kann komplex sein, da Sie Konfiguration und Code ordnungsgemäß trennen, die Datenbankisolierung während des Tests durchführen, separate Test-und Produktionsdatenbanken verwenden und vieles mehr.
Hier sehen wir uns ein vollständiges Beispiel an, das zeigt, wie wir mit dem Erstellen einer Anwendung beginnen können.
Lassen Sie uns zunächst unsere Einstellungen, unsere Definition von Datenbanktabellen und unsere Anwendungslogik trennen:
from starlette. config import Config (Eingabetaste)
from starlette. datastructures import secret (Deutsche Ausgabe)
config = Config (". env") Bearbeiten
DEBUG = config ('DEBUG', cast = bool und default = False)
SECRET_KEY = config ('SECRET_KEY', cast = geheim)
DATABASE_URL = config ('DATASE_URL')
Import von Sqlalchemy
Definition einer Tabelle.
metadata = sqlalchemy. metadata ()[Bearbeiten | Quelltext bearbeiten]
Die Tabelle " Tabelle " (
...
)
von starlette . applications import Starlette
von starlette . midleware import Middleware
from starlette . middleware . sessions import sessionMiddleware (engl . für „ Starlette . Middleware . Sitzungen importieren ")
von starlette . routing import Route
from myproject import settings von myproject import settings
async def Homepage (Anfrage) :
...
Die Bahn [ … ]
Route ("/" , endpoint = homepage) oder
]
Mittelfeld [ ]
Die Midlife-Funktion (
mit Middleware ,
secret _ key = Einstellungen . secret _ key
)
]
app = Starlette (debug = settings . DEBUG , routes = routes , middleware = middleware) (debug = settings . DEBUG , routes = routes , middleware = middleware) (siehe Abbildung)
Lassen Sie uns nun mit unserer Testkonfiguration umgehen Wir möchten bei jeder Testsuite-Ausführung eine neue Testdatenbank erstellen und nach Abschluss des Tests entfernen Wir möchten auch sicherstellen , dass sie entfernt wird .
from starlette . config import environ (englisch)
von starlette . testclient import TestClient
from sqlchemy import create _ engine () [ Bearbeiten ]
von sqlalchemy _ utils import create _ database , database _ exists , drop _ database
# Diese Zeile hätte einen Fehler verursacht , wenn wir sie nach ' Einstellungen ' verwendet hätten , die wichtig gewesen wären .
[ [ Kategorie : Hochhaus | Hochhaus ] ] = " Wahrheit "
von myproject import settings
vommyproject.appDie Import App
from myproject . tables import metadata (Tabellen importieren)
@pytest . fixture (autouse = true , scope = " session ")@pytest . fixture (autouse = true , scope = " Sitzung ")
def setup_test_database (): def setup_test_database-Funktion:
"""
Erstellen Sie eine saubere Testdatenbank jedes Mal, wenn die Tests laufen.
"""
url = settings. DATABASE_URL (Einstellungen. DATASE_URL)
engine = create_engine (url) Bearbeiten
assert not database_exists (url),'Testdatenbank bereits vorhanden.
create_database (url) erzeugen #Erstellen Sie die Testdatenbank.
metadata. create_all (Englisch) Erstellen Sie die Tables
und yield #Führen Sie die Tests aus.
Die Datei drop_database (url) Klicken Sie auf die Test-Datenbank.
@ pytest. fixture ()(auf Englisch)
def der Client ():
"""
Make a 'client' fixture available to test cases Machen Sie eine 'client' fixture available zum Testen von Karten.
"""
Unsere Struktur wird innerhalb eines Kontextmanagers erstellt.
#Anwendung Lifespan läuft für jeden Testfall.
mit TestClient (app) als test_client:
Testbericht_client