To podmínkování jsme používali i poslední firmě, jen toho pak časem bylo nějak moc. Pokud budu muset do základního/společného modulu, asi to bude právě takto "trapně", stylem IF ()..., ale zatím jsem se tomu ubránil. Nicméně už nyní má každý klient v settings.py USER_ID = "jmeno_klienta", takže to asi jednoho dne nastane.
Spoléhat se na něco, že to vždy vybere správnou DB nechci, takže v settings (ad klient) je konfigurace databáze pro daného klienta. Navíc jsem zůstal u SQLite (jedná se zatím o tisíce řádek denně), neboť miluji, když celý projekt je v souborech. Měj se, Standa On Tuesday, 6 October 2020 at 11:50:34 UTC+2 MirekZv wrote: > Zaujalo mě, že se tady vůbec neprobírá možnost použít Sites framework (ze > základní instalace, contrib.sites). > Pak bys udržoval jeden kód, který by pouze v settings.py dělal: from > konfigurace_tehle_firmy import SITE_ID, a kód by sis větvil: if > SITE_ID=n:... > Resp. pokud v konfiguráku SITE_ID nemáš, tj. máš společný konfigurák pro > více zákazníků, tak Sites framework určí SITE_ID podle domény (url). > Neboli, dávalo by Ti to možnost pro větší zákazníky mít extra instalaci a > extra databázi. > > Jinak s multitenant jsem si něco zkoušel, konkrétně s > django-tenant-schemas, které mají každou kopii databáze jako jedno Postgres > schéma a podle domény (např. podle domény 3.řádu: zakaznik.sluzba.cz) > vyberou schéma, se kterým pracují. > Funguje to, zdá se dobře. > Seznam zákazníků si uděláš do své aplikace např. customer, do tabulky > např. customers.Customer. Je otázka, jestli by to šlo směřovat přímo na > djangové Sites, to asi ne (asi nebudou sedět pole, která má Sites a pole, > která chce django-tenant-schemas), ale neměl by být problém nějak druhotně > určit to SITE_ID, abys mohl větvit kód podle zákazníka, pokud má mít něco > extra. > > No a nebo to zkombinovat nějak jakkoli jinak: třeba nastavené SITE_ID by > znamenalo produkční instalaci, přičemž ta by buď jela přímo (velký > zákazník, vše pro něj extra), nebo s django-tenant-schemas + tabulkou > Customers (malý zákazník, sdílí Postgres cluster). > Kombinace SITE_ID a customers.id by pak dávala unikátní klíč, který > určuje zákazníka. Ten třeba pomocí nějaké tabulky centrální evidence > zákazníků změnit na string, a větvit úplně obyčejně: if > request.zakaznik='TESCO':... > > Napsal jsem schválně request.zakaznik, protože takovou věc je asi vhodné > přiřadit v middlewaru (=vždy). > > > Dne čtvrtek 17. září 2020 v 13:58:49 UTC+2 uživatel Messa napsal: > >> Ahoj, >> >> pár nápadů: >> >> - je fajn si rozmyslet, jestli chceš provozovat pro každého klienta >> samostatnou instanci (kontejner apod.), nebo to mít vše v jedné. Se >> samostatnými instancemi je víc režie, ale zase je např. omezený blast >> radius, pokud se něco u jedné z nich podělá. Samostatné instance bych asi >> řešil jen pokud jich bude třeba do deseti. Na druhou stranu my třeba víc >> instancí toho samého používáme pro škálování (sharding) a pro >> speciální deploymenty pro "VIP klienty", ale všechny instance mají stejný >> kód, jen jinou db. >> >> - chce to trochu software engineering :) Víc git větví bych nedělal, do >> toho se můžeš zamotat, a nebo se v tom pak už nevyzná někdo, s kým bys na >> tom případně spolupracoval. Spíš by tě mohly zajímat feature flagy, design >> patterny pro pluginy, věci trochu víc zapouzdřit, než v Djangu bývá >> běžné... Oddělovat věci do knihoven nebo modulů... Možná se nejdřív >> zamyslet, jak bys to dělal, kdyby to byl normální softwarový projekt (který >> začíná main funkcí a vše řeší explicitně), a pak přijít na to, jak to >> udělat v Djangu :) >> >> - možná by stálo zato to rozdělit do komponent. Např. backend bude >> stejný, frontend se může lišit u každého klienta. Btw. toto teď řeší >> Shoptet Premium, vyšlo o nich pár podcastů, mají zajímavý přístup (ale >> neříkám, že bych to dělal přesně takto). >> >> - asi by ses neměl bránit zlepšování se v devops praktikách :) Když děláš >> takovéhle věci, tak to chce mít infrastrukturu, o kterou se můžeš opřít. >> >> - je otázka, jak naložit s databází (v podstatě pro ni platí ty samé >> úvahy výše, jako pro celou aplikaci), to by chtělo vědět, co tam bude za >> data a jestli/jak se mohou mezi klienty strukturně lišit. Tady mám třeba >> zkušenosti s tím, že jsme na několika místech udělali >> overengineered generalizovaný systém, který by měl teoreticky zvládnout >> jakéhokoliv klienta (resp. jeho data) nějakým univerzálním způsobem, ale >> pak to stejně shořelo na něčem, s čím nikdo vůbec nepočítal :) a takový >> systém pak tvoří zbytečná omezení nebo dokonce hacky (což je paradoxně to, >> čemu měl ten systém zabránit). Takže nakonec máme spíš kód, který na první >> pohled vypadá duplikovaný (což triggeruje programátorské ADHD) ale zase je >> triviálně přehledné, co to dělá a jak se logika liší mezi jednotlivými >> klienty. Mimochodem mě se tady líbí nosql přístup, ve kterém se >> můžeš vyhnout migracím a může být jednodušší pracovat s mnoha "malými" >> databázemi/kolekcemi, včetně operations aspektů; ale nosql a django možná >> není dobrá kombinace. >> >> Jako tohle jsou přesně věci, které když se pokazí, tak rozpočet, kvalita >> kódu a použitelnost projektu jdou přes palubu :) Ale jestli to >> programuješ sám, tak snad nebudeš moc trpět sunken cost syndromem. >> >> Petr >> >> so 12. 9. 2020 v 0:25 odesílatel stanisl...@gmail.com < >> stanisl...@gmail.com> napsal: >> >>> Zdravím, >>> >>> potřeboval bych poradit či navést na best-practice v Django, jak jeden >>> projekt nasadit pro více firem, ale tak, abych v čase mohl dělat klientské >>> modifikace. Aktuálně jsem vymyslel aplikaci a používají ji 2 moji klienti. >>> Django aplikace běží na nGinx a abych mohl obě aplikace aktualizovat >>> současně, na serveru jsem nalinkoval společné zdrojové kódy (virtuál >>> linkuje společné adresáře/aplikace). Vše běží, protože každá aplikace má >>> svou konfiguraci a svou databázi. Pokud aplikaci vylepším, nahraju ji na 1 >>> místo, restartuji server či oba virtuály a oba klienti frčí na >>> aktualizacích. >>> >>> Nicméně: jak nejlépe postupovat, pokud např. 1. firma bude chtít nějakou >>> změnu v šabloně, 2. firma například upravit či přidat celou funkčnost. Rád >>> bych udržel zdrojový kód jednotný s nějakými "odbočkami" pro konkrétního >>> klienta, ale nemohu najít jak nejlépe a nejsystémověji se tomu postavit, >>> aby projekt byl dlouhodobě spravovatelný, zvlášť pokud by přibylo klientů. >>> >>> Věřím, že existuje nějaké systémové řešení, budu rád i za navedení či >>> odkaz na nějaký tutorial. Předem díky! >>> >>> -- >>> >> -- >>> E-mailová skupina djan...@googlegroups.com >>> Správa: http://groups.google.cz/group/django-cs >>> --- >>> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny >>> „django-cs“ ve Skupinách Google. >>> >> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, >>> zašlete e-mail na adresu django-cs+...@googlegroups.com. >>> Chcete-li tuto diskusi zobrazit na webu, navštivte >>> https://groups.google.com/d/msgid/django-cs/f508f99c-c9d9-46c4-9ce3-102506cd4634n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/django-cs/f508f99c-c9d9-46c4-9ce3-102506cd4634n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- -- E-mailová skupina django-cs@googlegroups.com Správa: http://groups.google.cz/group/django-cs --- Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google. Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/53bc9572-47c5-4bb1-b639-881850ee1467n%40googlegroups.com.