Sozlamalar
Butun sozlash imkoniyatlari — har bir guruh, har bir maydon, uning standart qiymati va nega aynan shu standart tanlangani.
Mavjud v0.1.0
Sozlamalar tekis ro‘yxat emas, balki guruhlarga bo‘lingan — shu sababli nom darhol qaysi quyi tizimga tegishli ekanini bildiradi, va yangi parametrlarni yuqori darajani yuzlab maydonga aylantirmasdan qo‘shish mumkin.
from fastfort import FastFortSettings
settings = FastFortSettings(
project_name="Fastfort Freight",
admin={"page_size": 25, "count_strategy": "capped"},
ui={"accent_hue": 232, "timezone": "Asia/Tashkent"},
security={"cookie_secure": True, "hsts_seconds": 31_536_000},
)
Muhit o‘zgaruvchilaridan
Har qanday qiymatni FASTFORT_ prefiksi va ichma-ichlik uchun ikkita pastki
chiziqdan foydalanib, muhit o‘zgaruvchilari orqali berish mumkin:
FASTFORT_SECRET_KEY=...
FASTFORT_DEBUG=false
FASTFORT_ADMIN__PAGE_SIZE=50
FASTFORT_ADMIN__COUNT_STRATEGY=capped
FASTFORT_SECURITY__COOKIE_SECURE=true
FASTFORT_UI__ACCENT_HUE=232
Har bir guruhda extra="forbid" o‘rnatilgan, shuning uchun kalitdagi xato —
sukut bo‘yicha hech narsa qilmaydigan sozlama emas, balki ishga tushirish
xatosi.
Yuqori daraja
| Maydon | Turi | Standart qiymat | |
|---|---|---|---|
secret_key | SecretStr | majburiy | Sessiyalarni, CSRF-tokenlarni va JWT’larni imzolaydi. Uni almashtirish uchtasini ham bekor qiladi. |
project_name | str | "FastFort" | Sarlavhada va sahifa nomlarida ko‘rsatiladi. |
auth_url | str | "/auth" | Kirish va chiqish yo‘nalishlari ulanadigan manzil. |
debug | bool | False | Xatolik izlari va shablonlarni keshlamaslik. Productionda hech qachon yoqilmasin. |
secret_key uchun standart qiymat yo‘q
Standart qiymatni o‘zida olib yuradigan freymvork qandaydir joylashtirishning aynan shu qiymat bilan ishlashini kafolatlaydi, shuning uchun xatolik ataylab ishga tushirish bosqichiga ko‘chirilgan — u yerda u darrov ko‘rinadi va arzon tuzatiladi. Validator uchta narsani rad etadi:
- Vaqtinchalik qiymatni. Tarkibida
change-me,your-secret,insecure,example,fastfortva yana oltita so‘z bo‘lgan har qanday qiymat — moslik qiymat ichidagi istalgan joyda qidiriladi, chunki vaqtinchalik qiymatni minimal uzunlikkacha “to‘ldirish” — shoshilinch odam aynan shunday qiladi. - 32 belgidan kamini.
- 8 tadan kam noyob belgini. Bu
aaaa…va1234512345…kabi qiymatlarni ushlaydi — ular uzunlik tekshiruvidan o‘tadi, lekin deyarli hech qanday entropiya olib yurmaydi.
uv run fastfort generate-secret --export
# FASTFORT_SECRET_KEY=xK9v…
Faqat ekranga chiqariladi, boshqa hech qayerga emas — hech qachon faylga yozilmaydi. Vosita diskka yozgan sir — bu ertami-kechmi commit qilinadigan sir.
admin — admin panel qayerda joylashgan va u nimalarni ochib beradi
| Maydon | Standart qiymat | |
|---|---|---|
url | "/admin" | Boshida slesh bo‘ladigan holga keltiriladi; sayt ildizi rad etiladi. |
page_size | 20 | |
page_size_choices | (20, 50, 100) | Agar faol page_size ro‘yxatda bo‘lmasa, u avtomatik qo‘shiladi — shuning uchun 25 ni sozlagan loyiha o‘z qiymatini ko‘radi. |
max_page_size | 200 | ?ps= uchun qat’iy chegara. Bo‘lmasa, bitta so‘rov jadvaldagi barcha qatorlarni so‘rashi mumkin. |
count_strategy | "exact" | exact · capped · estimated. |
count_cap | 10_000 | capped sanashni to‘xtatadigan chegara; interfeys buni «10000+» deb ko‘rsatadi. |
autocomplete_limit | 20 | Bitta avtomatik to‘ldirish so‘rovi qaytarishi mumkin bo‘lgan qatorlar soni. |
export_limit | 50_000 | Bitta eksport uchun qat’iy chegara. |
export_chunk_size | 1_000 | Oqim uzatishda bitta murojaatdagi qatorlar soni. |
dashboard_days | 30 | O‘zining alohida oynasi ko‘rsatilmagan har bir vaqt bo‘yicha grafik chizadigan dashboard vidjeti foydalanadigan oyna. Har kun uchun bitta indekslangan hisob — demak, bosh sahifa ishga tushiradigan so‘rovlar soni ham shu. 0 bu grafiklarni o‘chiradi. |
signup_field | "" | Hisob qachon yaratilganini saqlaydigan foydalanuvchi ustuni; bo‘sh qoldirilsa, avtomatik aniqlanadi. |
export_limit nega kerak
Eksport joriy so‘rovni sahifalashsiz bajaradi. Chegara bo‘lmasa, o‘n million qatorli jadvalda tasodifan bosilgan hammasini eksport qilish — hech qachon tugamaydigan so‘rov va boshqa hech kimga javob bermay qo‘yadigan ma’lumotlar bazasi degani.
count_strategy ni tanlash
exact har bir mos qatorni sanaydi — katta jadvalda bu so‘rov vaqtining katta
qismini egallaydi, ko‘pincha sanash o‘zi hamroh bo‘lgan qatorlar sahifasidan
ham qimmatga tushadi. capped count_cap da to‘xtaydi; estimated
ma’lumotlar bazasidan o‘zining statistikasini so‘raydi. Bir necha yuz mingdan
ortiq qatorli har qanday jadval uchun kerakli tanlov — capped.
ui — tashqi ko‘rinish
Butun palitra OKLCH’dagi bitta rangdan hosil qilinadi. Rebrending — bu raqam, qayta qurish emas: bunda na sozlash bosqichi, na fork qilinadigan stil fayli bor.
| Maydon | Standart qiymat | |
|---|---|---|
accent_hue | 255 | 0–360. |
accent_chroma | 0.16 | 0–0.37. |
theme | "system" | system · light · dark. |
density | "comfortable" | comfortable · compact. |
logo_url · favicon_url | None | |
richtext_url | None | Har bir richtext maydonini yaxshilaydigan skript. |
custom_css_url | None | O‘rnatilgan stil faylidan keyin yuklanadi. |
map_tile_url | "" | Bo‘sh qiymat — xarita yo‘qligini bildiradi. |
map_attribution | "" | |
map_center | "0, 0" | Butun dunyo ko‘rinishi, kimningdir poytaxti emas. |
map_max_zoom | 19 | Tayl manbasida rasm mavjud bo‘lgan eng chuqur daraja. |
language | None | None — brauzer tiliga ergashadi. |
locale_dir | None | Ustuvorlikka ega bo‘lgan o‘zingizning <language>.json fayllaringiz. |
timezone | "UTC" | |
environment_label | None | Sarlavhada ko‘rsatiladi. |
environment_tone | "warning" | info · warning · danger. |
map_tile_url sukut bo‘yicha o‘chirilgan
Uni yoqish — admin panel rasmlarni boshqa birovning serveridan olib kelishini anglatadi. O‘sha server qaysi qatorlar ko‘rilayotgani va ular taxminan qayerda ekanini biladi, va tayl xizmatlarining aksariyati bu haqda o‘z shartlariga ega. URL ko‘rsatish — loyihangiz ularni o‘qib chiqqanini bildiradi.
Bu manzil admin panelning CSP siyosatidagi img-srcga qo‘shiladi — shuning
uchun bu sozlama, shablon qo‘sha oladigan narsa emas.
map_max_zoom — manbaning xususiyati, vidjetniki emas
19 — OpenStreetMap standart qatlami to‘xtaydigan daraja. Ba’zi tijorat rastr qatlamlari 22 gacha yetadi, va shu qatlamlardan biri standart qiymat bilan sozlansa, imkoniyatidan uch daraja pastroqda ma’lumot oladi — sabab yo‘q joyda loyqaroq xarita.
ui={"map_tile_url": "https://tiles.example.com/{z}/{x}/{y}.png", "map_max_zoom": 22}
Bu so‘rovlar uchun chegara. Ko‘rinish baribir undan ikki daraja o‘tib kattalashadi va oxirgi mavjud taylni cho‘zadi — bu har qanday xarita ilovasi o‘z tasviridan tashqarida qiladigan ish, va bu javob berishni to‘xtatadigan tugmadan yaxshiroq.
richtext_url hech narsani o‘z ichiga olmaydi
Muharrir — sizning tanlovingiz: CKEditor, TinyMCE, Quill yoki litsenziyangiz
allaqachon bor bo‘lgan har qanday boshqasi. FastFort textarea’ni chizadi va uni
data-ff-richtext bilan belgilaydi; ushbu sozlamada shu maydonlarni topadigan
skript ko‘rsatiladi. None oddiy textarea’ni qoldiradi — bu ishlaydigan
boshqaruv elementi, buzilgan muharrir emas.
Muharrirni o‘rnatilgan holda taqdim etish muqobil variant edi, ammo bu
noto‘g‘ri kelishuv: har bir loyiha uchun wheel paketida yarim megabayt
muharrir, holbuki ularning aksariyatiga boshqasi kerak yoki umuman kerak emas.
Agar URL boshqa manbada bo‘lsa, o‘sha manba script-srcga qo‘shiladi — bu
sozlama bo‘lishining aynan sababi shunda.
environment_label
ui={"environment_label": "PRODUCTION", "environment_tone": "danger"}
Shunday qilib, kimdir ochib qo‘ygan ikkita oyna orasidagi farq o‘qimasdan ham ko‘rinib turadi.
security — cookie’lar, CSRF va sarlavhalar
Standart qiymatlar eng qat’iylari. Ulardan birortasini yumshatish uchun ko‘rib chiqishda ko‘rinadigan aniq o‘zgarish kerak bo‘ladi.
| Maydon | Standart qiymat | |
|---|---|---|
cookie_name | "fastfort_session" | |
cookie_secure | True | |
cookie_httponly | True | |
cookie_samesite | "lax" | none uchun cookie_secure=True talab qilinadi. |
cookie_domain · cookie_path | None · "/" | |
csrf_enabled | True | |
csrf_header_name | "X-CSRF-Token" | |
csrf_field_name | "_csrf" | |
security_headers | True | CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy. |
hsts_seconds | 0 | |
trust_forwarded_for | False |
trust_forwarded_for
Buni faqat sarlavhani qayta yozadigan proksi ortida yoqing. Sarlavhaga qo‘shib yozadigan proksi ortida yoki umuman proksisiz mijoz o‘z manzilini soxtalashtirishi mumkin — va bloklash hamda audit yozuvlari keyin tajovuzkor tanlagan kimsaga tegishli bo‘lib qoladi.
CSP
default-src 'none' dan boshlanadi, script-src 'self' bilan va nonce’siz.
Demak: ichki <script> yo‘q, ichki hodisa ishlovchilari yo‘q, CDN yo‘q.
Ma’lumot brauzerga data- atributlari orqali yetib boradi.
Loyiha aynan ikkita direktivani kengaytirishi mumkin, har birini aynan bitta
manba bilan: img-src (ui.map_tile_url orqali) va script-src
(ui.richtext_url orqali).
auth — tokenlar, parollar va bloklash
| Maydon | Standart qiymat | |
|---|---|---|
access_token_ttl | 900 | Soniya. Ataylab qisqa. |
session_ttl | 1_209_600 | Admin panelning brauzer sessiyasi — ish kuni API yangilash oynasi bilan bir xil emas. |
refresh_token_ttl | 1_209_600 | |
rotate_refresh_tokens | True | |
revoke_family_on_reuse | True | |
algorithm | "HS256" | HS256/384/512 · RS256 · EdDSA. |
issuer · audience | None | |
password_min_length | 10 | |
password_reject_common | True | |
lockout_threshold | 5 | Identifikator yoki manzil bloklanishidan oldingi muvaffaqiyatsiz urinishlar soni. |
lockout_seconds | 60 | Boshlang‘ich kechikish; har keyingi muvaffaqiyatsiz urinish bilan ortib boradi. |
lockout_window_seconds | 900 | |
allow_password_change | True | O‘chirilsa, hech bir hisobning parolini admin panel orqali o‘zgartirib bo‘lmaydi. |
allow_superuser_password_change | True | O‘chirilsa, superfoydalanuvchi parolini faqat o‘zi o‘zgartira oladi. |
allow_user_delete | True | O‘chirilsa, hech qanday hisobni o‘chirib bo‘lmaydi. |
allow_superuser_delete | True | O‘chirilsa, superfoydalanuvchilarni o‘chirib bo‘lmaydi. Odatda ochiq demo uchun kerak bo‘ladigan sozlama. |
Har bir yangilash yangi token chiqaradi va eskisini chiqindiga chiqaradi. Chiqindiga chiqarilgan tokenni qayta ishlatish uni o‘g‘irlanganini bildiradi, shuning uchun uning butun oilasi bekor qilinadi.
media — yuklangan fayllar
| Maydon | Standart qiymat | |
|---|---|---|
root | Path("media") | Birinchi foydalanishda yaratiladi. |
upload_limit | 10_000_000 | Baytlar. |
Lokal disk — chunki har qanday loyiha oldindan hech narsa tayyorlamasdan unga tayanishi mumkin; obyekt xotira esa sizning o‘z integratsiyangiz, bu yerdagi bog‘liqlik emas.
Yuklangan fayllar admin panel orqali, boshqa har qanday sahifa bilan bir xil to‘siq ortidan xizmat qiladi, alohida autentifikatsiyasiz statik yo‘ldan emas. Yuklangan fayl — har qanday boshqa qator kabi yozuv, ommaviy resurs emas.
So‘rov yuklash tugaganini aniqlashdan oldin upload_limitdan ko‘pi bilan
bitta bayt ortiqcha o‘qiydi — shuning uchun hajmi katta fayl avval to‘liq
xotiraga joylashib, keyin necha gigabayt ekani aniqlanishi o‘rniga, maydondagi
validatsiya xatosiga aylanadi.
Joylashtirishni tekshirish
uv run fastfort check --app main:fort --deploy
Xatolik ko‘tarish o‘rniga satrlarni qaytaradi, shuning uchun bitta ishga tushirish barcha muammolar haqida xabar beradi:
Fastfort Freight · 17 model(s)
warn debug=True exposes tracebacks and internal state. Set FASTFORT_DEBUG=false.
warn security.cookie_secure=False sends the session cookie over plain HTTP.
Set FASTFORT_SECURITY__COOKIE_SECURE=true and serve over HTTPS.
warn auth.access_token_ttl is 7200s. A leaked access token stays valid that
long; 900s is the recommended ceiling.
3 problem(s) found.
Nolga teng bo‘lmagan kod bilan yakunlanadi, shuning uchun u joylashtirishni
to‘xtatib turishi mumkin. settings.require_production_ready() — xuddi shu
tekshiruv, faqat istisno shaklida, ishga tushirishning butunlay rad etilishini
xohlaydigan loyiha uchun.