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

MaydonTuriStandart qiymat
secret_keySecretStrmajburiySessiyalarni, CSRF-tokenlarni va JWT’larni imzolaydi. Uni almashtirish uchtasini ham bekor qiladi.
project_namestr"FastFort"Sarlavhada va sahifa nomlarida ko‘rsatiladi.
auth_urlstr"/auth"Kirish va chiqish yo‘nalishlari ulanadigan manzil.
debugboolFalseXatolik 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, fastfort va 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… va 1234512345… 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

MaydonStandart qiymat
url"/admin"Boshida slesh bo‘ladigan holga keltiriladi; sayt ildizi rad etiladi.
page_size20
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_size200?ps= uchun qat’iy chegara. Bo‘lmasa, bitta so‘rov jadvaldagi barcha qatorlarni so‘rashi mumkin.
count_strategy"exact"exact · capped · estimated.
count_cap10_000capped sanashni to‘xtatadigan chegara; interfeys buni «10000+» deb ko‘rsatadi.
autocomplete_limit20Bitta avtomatik to‘ldirish so‘rovi qaytarishi mumkin bo‘lgan qatorlar soni.
export_limit50_000Bitta eksport uchun qat’iy chegara.
export_chunk_size1_000Oqim uzatishda bitta murojaatdagi qatorlar soni.
dashboard_days30O‘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.

MaydonStandart qiymat
accent_hue2550–360.
accent_chroma0.160–0.37.
theme"system"system · light · dark.
density"comfortable"comfortable · compact.
logo_url · favicon_urlNone
richtext_urlNoneHar bir richtext maydonini yaxshilaydigan skript.
custom_css_urlNoneO‘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_zoom19Tayl manbasida rasm mavjud bo‘lgan eng chuqur daraja.
languageNoneNone — brauzer tiliga ergashadi.
locale_dirNoneUstuvorlikka ega bo‘lgan o‘zingizning <language>.json fayllaringiz.
timezone"UTC"
environment_labelNoneSarlavhada 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.

MaydonStandart qiymat
cookie_name"fastfort_session"
cookie_secureTrue
cookie_httponlyTrue
cookie_samesite"lax"none uchun cookie_secure=True talab qilinadi.
cookie_domain · cookie_pathNone · "/"
csrf_enabledTrue
csrf_header_name"X-CSRF-Token"
csrf_field_name"_csrf"
security_headersTrueCSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy.
hsts_seconds0
trust_forwarded_forFalse

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

MaydonStandart qiymat
access_token_ttl900Soniya. Ataylab qisqa.
session_ttl1_209_600Admin panelning brauzer sessiyasi — ish kuni API yangilash oynasi bilan bir xil emas.
refresh_token_ttl1_209_600
rotate_refresh_tokensTrue
revoke_family_on_reuseTrue
algorithm"HS256"HS256/384/512 · RS256 · EdDSA.
issuer · audienceNone
password_min_length10
password_reject_commonTrue
lockout_threshold5Identifikator yoki manzil bloklanishidan oldingi muvaffaqiyatsiz urinishlar soni.
lockout_seconds60Boshlang‘ich kechikish; har keyingi muvaffaqiyatsiz urinish bilan ortib boradi.
lockout_window_seconds900
allow_password_changeTrueO‘chirilsa, hech bir hisobning parolini admin panel orqali o‘zgartirib bo‘lmaydi.
allow_superuser_password_changeTrueO‘chirilsa, superfoydalanuvchi parolini faqat o‘zi o‘zgartira oladi.
allow_user_deleteTrueO‘chirilsa, hech qanday hisobni o‘chirib bo‘lmaydi.
allow_superuser_deleteTrueO‘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

MaydonStandart qiymat
rootPath("media")Birinchi foydalanishda yaratiladi.
upload_limit10_000_000Baytlar.

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.