Konfigurasi
Starlette mendorong pemisahan konfigurasi dan kode yang ketat sesuai dengan pola dua belas faktor.
Konfigurasi harus disimpan dalam variabel lingkungan atau tidak berkomitmen untuk pengendalian sumber .env Dalam file.
Dari sqlalchemy import create _ engine
Starlette.application diimpor dari Starlette
Konfigurasi impor dari starlette.config
Dari starlette.datastructures impor CommaSeparatedStrings, Rahasia
# Konfigurasi akan dibaca dari variabel lingkungan dan / atau. File "env."
Konfigurasi = Konfigurasi (. "env")
DEBUG = konfigurasi ('DEBUG', cast = bool, default = Salah)
DATABASE _ URL = konfigurasi ('DATABASE _ URL')
SECRET _ KEY = konfigurasi ('SECRET _ KEY', cast = Rahasia)
DIIZINKAN _ HOSTS = konfigurasi ('DIIZINKAN _ HOSTS', cast=CommaSeparatedStrings)
Aplikasi = Starlette (debug = DEBUG)
Mesin = buat _ mesin (DATABASE _ URL)
...
# Jangan lakukan ini pada kontrol sumber.
# Misalnya. Sertakan. "env" dalam file `.gitignore` Anda.
DEBUG = Benar
DATABASE _ URL = postgresql: / / user: password@localhost: 5432 / database
RAHASIA _ KEY=43n080musdfjt54t-09sdgr
DIIZINKAN _ HOSTS = 127.0.0.1, localhost
mengkonfigurasi prioritas
Urutan baca nilai konfigurasi adalah:
- Dari variabel lingkungan.
- dari file
.env. Nilai default yang diberikan oleh* dalamconfig.
Jika tidak ada yang cocok, maka config(...) akan meningkatkan kesalahan.
Rahasia
Untuk tombol sensitif, kelas Secret berguna karena membantu meminimalkan kemungkinan bahwa nilai yang dipegangnya mungkin bocor ke backtracking atau introspeksi kode lainnya.
Untuk mendapatkan nilai instance Secret, itu harus secara eksplisit dikonversi menjadi string. Anda hanya boleh melakukan ini di mana nilai digunakan.
> > > pengaturan impor dari myproject
> > > pengaturan. RAHASIA
Rahasia ('* * * * * * * * *')
> > > str (set. RAHASIA _ KEY)
'98N349 $% 8b8-7yjn0n8y93T $23r'
Petunjuk
Anda dapat menggunakan DatabaseURL dari databases
Paket di sini
Untuk menyimpan URL database dan menghindari membocorkannya di log.
String terpisah koma
Tipe CommaSeparatedStrings berguna untuk menahan beberapa konten dalam satu tombol konfigurasi.
> > > pengaturan impor dari myproject
> > > cetak (settings.ALLOWED _ HOSTS)
CommaSeparatedStrings (['127.0.0.1', 'localhost'])
> > > cetak (daftar (pengaturan DIIZINKAN _ HOSTS))
['127.0.0.1', 'localhost']
> > > cetak (len (settings.ALLOWED _ HOSTS))
2
> > > cetak (settings.ALLOWED _ HOSTS [0])
'127.0.0.1'
Baca atau ubah lingkungan
Dalam beberapa kasus, Anda mungkin ingin membaca atau mengubah variabel lingkungan secara terprogram. Ini sangat berguna dalam pengujian, di mana Anda mungkin ingin mengesampingkan kunci tertentu di lingkungan Anda.
Anda harus menggunakan instance environ Starlette daripada membaca atau menulis dari os.environ.
Contoh ini memetakan ke os.environ standar dan memberi Anda perlindungan tambahan dengan melakukan kesalahan jika Anda mengatur variabel lingkungan setelah konfigurasi membacanya.
Jika Anda menggunakan pytest, Anda dapat mengatur lingkungan awal apa pun di tests/conftest.py.
Dari starlette.config import environ
Environ ['DEBUG'] = 'BENAR'
Baca variabel lingkungan awalan
Anda dapat menamespace variabel lingkungan dengan mengatur parameter env_prefix.
os impor
Konfigurasi impor dari starlette.config
Os.environ ['APP _ DEBUG'] = 'ya'
Os.environ ['LINGKUNGAN'] = 'dev'
Konfigurasi = Konfigurasi (env _ prefix = 'APP _')
DEBUG = konfigurasi ('DEBUG') # lookups APP _ DEBUG, mengembalikan "ya"
LINGKUNGAN = konfigurasi ('LINGKUNGAN') # lookups APP _ LINGKUNGAN, menimbulkan KeyError karena variabel tidak didefinisikan
Contoh lengkap
Membangun aplikasi besar bisa jadi rumit. Anda perlu memisahkan konfigurasi dan kode dengan benar, mengisolasi basis data selama pengujian, menggunakan basis data pengujian dan produksi terpisah, dan sebagainya.
Di sini, kita akan melihat contoh lengkap yang menunjukkan bagaimana kita dapat mulai membangun aplikasi.
Pertama, mari kita pisahkan pengaturan kami, database & definisi tabel kami, dan logika aplikasi kami:
Konfigurasi impor dari starlette.config
Impor rahasia dari starlette.datastruktur
Konfigurasi = Konfigurasi (. "env")
DEBUG = konfigurasi ('DEBUG', cast = bool, default = Salah)
SECRET _ KEY = konfigurasi ('SECRET _ KEY', cast = Rahasia)
DATABASE _ URL = konfigurasi ('DATABASE _ URL')
meter persegi import
# Definisi tabel database.
Metadata = sqlalchemy. MetaData ()
Organisasi = sqlalchemy. Tabel (
...
)
Starlette.application diimpor dari Starlette
Impor Middleware dari starlette.middleware
Dari starlette.middleware.session impor SessionMiddleware
Dari starlette. rute impor routing
Dari pengaturan impor myproject
Sinkronisasi beranda def (permintaan):
...
Rute = [
Rute ("/," titik akhir = beranda)
]
Peralatan Tengah = [
Peralatan Tengah (
Peralatan Sesi Middleware,
secret _ key = setting.RAHASIA _ KEY,
)
]
App = Starlette (debug = pengaturan. DEBUG, rute = rute, middleware=middleware)
Sekarang mari kita berurusan dengan konfigurasi pengujian kita. Kami ingin membuat database pengujian baru setiap kali rangkaian pengujian berjalan dan menghapusnya setelah pengujian selesai. Kami juga ingin memastikan bahwa
Dari starlette.config import environ
Dari starlette.testclient impor TestClient
Dari sqlalchemy import create _ engine
Dari sqlalchemy _ utils import create _ database, database _ ada, drop _ database
# Baris ini akan meningkatkan kesalahan jika kita menggunakannya setelah 'pengaturan' diimpor.
Environ ['DEBUG'] = 'BENAR'
Dari pengaturan impor myproject
Impor aplikasi dari myproject.app
Dari myproject.tables mengimpor metadata
@ Pytest.fixture (autouse = Benar, scope = "sesi")
Def setup _ test _ database ():
"""
Buat database tes bersih setiap kali tes di jalankan.
"""
Url = pengaturan. DATABASE _ URL
Mesin = buat _ mesin (url)
Tegaskan tidak database _ ada (url), 'Uji database sudah ada. Aborting tes.'
buat _ database (url) # Buat database pengujian.
Metadata. buat _ semua (mesin) # Buat tabel.
Hasil # Jalankan tes.
drop _ database (url) # Jatuhkan database tes.
@ pytest.fixture ()
Pasti klien ():
"""
Buatlah perlengkapan 'klien' tersedia untuk menguji kasus.
"""
# Perlengkapan kami dibuat dalam manajer konteks. Ini memastikan bahwa
# Umur aplikasi berjalan untuk setiap kasus tes.
Dengan TestClient (aplikasi) sebagai test _ client:
Tes hasil _ klien