Závěr: Nakonec jsem se příliš bál toho `os.getcwd()` a udělal jsem si tuto funkci: ``` import inspect import os from pathlib import Path
def get_project_root(): for prg in inspect.stack()[::-1]: prg = prg.filename if '/wsgi.py' in prg or '/asgi.py' in prg: return Path(prg).parent.parent elif '/manage.py' in prg: return Path(prg).parent else: return Path(os.getcwd()) BASE_DIR = get_project_root() PROJECT_NAME = BASE_DIR.name # to make some settings portable (DATABASES=..) PROJECT_DIR = BASE_DIR / PROJECT_NAME ``` Dne pondělí 22. února 2021 v 15:18:01 UTC+1 uživatel MirekZv napsal: > @Honza, @starenka > > Ahoj chlapi, především díky za vlídné a věcné odpovědi, čekal jsem spíš, > že po této otázce už na mě někdo vlítne a pěkně mi vynadá. > > Jo, máte přesně pravdu, bylo by to asi lepší (získat to v umístění > projektu a předat to nějakým parametrem), než účelu nepřiměřené úsilí, co > se s tím snažím dělat. > > Přidám nějakou story, jak jsem se do té situace dostal, snad z toho bude > něco jasnější, i když osobně jsem nad svým postupem dost na rozpacích: > > 1. Nejdřív jsem copy/pastoval ze starého projektu pro vytvoření nového, > jak se to asi běžně dělá. > 2. Pak jsem začal myslet na nějaký reuse, tak jsem si udělal jednu django > aplikaci na věci, které by asi byly potřebné ve 2+ projektech. > 3. Pak mě začalo štvát, že tu aplikaci mám pod jednotlivými projekty, > takže když ji někde změním, neměl bych zapomenout jít i do těch ostatních > projektů a udělat v ní stejné změny i tam. > 4. Pak jsem tu django aplikaci obecností odkopíroval do adresáře mimo, > udělal jí vlastní git repozitář, a instaluji ji nějak jako `poetry add > ../../obecna` > 5. Pak mě začalo štvát, že běžná django settings mají tak 200 řádek kódu, > stejně jsou vždycky skoro stejná, a když tam něco vylepším, tak zas abych > šel po projektech a implementoval vylepšení i do ostatních (a nebo v tom > měl chaos). > 6. Pak jsem si zkusil jakési django-split-settings, rozdělil ten mega-file > na 10 malých (vypadá to dobře, ale o vhodnosti tohoto mám velké pochyby, > protože to už jsme možná trochu u zacházení s jmennými prostory jako ve > Web2py). > 7. Pak jsem většinu nastavení přepsal tak, aby byla obecná, bez závislostí > na projektu. Příklad: Nemám důvod, proč by se moje postgres databáze neměla > jmenovat stejně jako projekt. Tak proč psát do nastavení natvrdo jméno > databáze? - toto je další věc, kterou na Djangu nemám rád, že když dělá > startproject, tak rozkopíruje po x souborech na y míst jméno projektu jako > string. > 8. Pak jsem (ze stejných důvodů jako výše) to odsunul mimo ty mé projekty. > > Takže: mohl bych si to nastavit v projektech a předat jako parametr. Ale > čím míň toho zůstane customizovaného pro projekty, tím lépe. > Navíc to django-split-settings se volá pomocí jakýchsi funkcí include() a > optional() a nejsem si tak úplně jistý, jak snadno tam jdou parametry > předávat. > > Dne pondělí 22. února 2021 v 14:58:03 UTC+1 uživatel MirekZv napsal: > >> @John >> >> Jo, zase jsem horlivější než je vhodné. >> Nemyslel jsem to tak, že já sám chci mít na stagingu/produkci/.. různá >> prostředí. >> Myslel jsem to tak, že kdyby se to někdy z nějakých nyní neznámých důvodů >> ocitlo pod jiným prostředím (např. na různých cloudech), aby to chodilo. >> Čili přehnaná snaha o obecnost, která se nakonec skoro vždycky spíš >> vymstí. >> >> Jinak vyvíjím i nasazuji na poslední Debian, takže vlastně skoro >> identické prostředí na vývoji i produkci. >> Díky tedy za doporučení dockeru, já už jsem si s ním kdysi pohrával, ale >> zjistil jsem, že pro laika to zas tak ultrasnadné není, >> pak se mi zdá, že to docela žere místo na disku (zvlášť když tam >> zapomeneš něco nesmazaného z předchozích pokusů), což při nasazování na >> (cizí=veřejný) virtuální server je dost zásadní, >> a pak, když to jedu vše na Debianu, tak by ten přínos zas tak zásadní >> nebyl. >> Takže Docker je zatím odložen. >> >> Dne pátek 19. února 2021 v 22:59:35 UTC+1 uživatel starenka napsal: >> >>> A kdyz to teda volas z toho prokektu, proc to ty fci v tom modulu >>> nepredas jako arg? >>> >>> >>> On Fri, Feb 19, 2021, 22:51 Jan Bednařík <jan.be...@gmail.com> wrote: >>> >>>> A nemůžeš mít název toho projektu jako konstantu přímo v settings? >>>> Zjišťovat to z názvu adresáře mi přijde příliš křehké. >>>> >>>> A Sites znáš? to je takovej dobrej způsob, jak pracovat s více projekty >>>> / instalacemi / weby v jedné code base: >>>> https://docs.djangoproject.com/en/3.1/ref/contrib/sites/ >>>> >>>> Honza >>>> >>>> pá 19. 2. 2021 v 19:50 odesílatel Jan Walter <jnw...@gmail.com> napsal: >>>> >>>>> Asi nejsem sto se přesně naladit na charakter Tvého problému, ale >>>>> pokud mohu poradit obecně, snažil bych se vystříhat tomu, aby "bylo na >>>>> produkci pokaždé něco jinak". >>>>> >>>>> My v partě máme oblíbený docker, což je technologie využitelná např. >>>>> na to, aby bylo, pokud možno, "všude všechno v základu stejně". >>>>> Doporučuji >>>>> Tvé pozornosti. >>>>> >>>>> John >>>>> >>>>> On Fri, 19 Feb 2021, 19:32 MirekZv, <mirek....@gmail.com> wrote: >>>>> >>>>>> Běží mi kód ve stacku projektu, >>>>>> ale dotyčný soubor se nachází mimo adresář projektu. >>>>>> Jak bych zjistil jméno projektu? >>>>>> >>>>>> Abych to trochu vysvětlil: >>>>>> V běžných django settings se řeší přesně toto, co potřebuju, třeba >>>>>> nějak přibližně takto: >>>>>> BASE_DIR = Path(__file__).resolve().parent.parent >>>>>> PROJECT_NAME = BASE_DIR.name >>>>>> >>>>>> Potřebuju totéž zjistit v souboru, který není v BASE_DIR. >>>>>> A to tak, že nechci nic nastavovat nikde v souborech pod BASE_DIR. >>>>>> >>>>>> Napadají mě 2 možnosti: >>>>>> - zjistit to nějak z inspect.stack() --ale nevím, jak to udělat dost >>>>>> bezpečně >>>>>> - vzít jenom os.getcwd() --za předpokladu, že mám úplně standardní >>>>>> projekt, se stejným jménem rootu i adresáře projektu >>>>>> >>>>>> Zatím jsem se spokojil s tím posledním. >>>>>> Myslíte, že by na to mohl být spoleh ve všech variantách na produkci? >>>>>> >>>>>> Alternativně: Dá se nějak snadno zjistit z kódu settings file >>>>>> (protože ten mám pod projektem; nebo prostě jakýkoli file, který je >>>>>> bezpečně pod adresářem projektu (např. ve stacku mám jako první >>>>>> manage.py, >>>>>> jenže to asi na produkci bude pokaždé jinak). >>>>>> >>>>>> Díky, tedy kdyby někdo věděl. >>>>>> >>>>>> -- >>>>>> -- >>>>>> 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/2c569772-cc17-437d-80ec-0411a0207c33n%40googlegroups.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/django-cs/2c569772-cc17-437d-80ec-0411a0207c33n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> -- >>>>> -- >>>>> 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/CAK-vJU%3D6zQW99QbNdrXSC7jGxNVxEB7y39M%2BDYUi%3DJQMG_MwLA%40mail.gmail.com >>>>> >>>>> <https://groups.google.com/d/msgid/django-cs/CAK-vJU%3D6zQW99QbNdrXSC7jGxNVxEB7y39M%2BDYUi%3DJQMG_MwLA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>>> -- >>>> 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/CAMmgUkNE8pvmhtkfV2VaN_cmzdB1WytZSMev-tbW9KyuBbOEog%40mail.gmail.com >>>> >>>> <https://groups.google.com/d/msgid/django-cs/CAMmgUkNE8pvmhtkfV2VaN_cmzdB1WytZSMev-tbW9KyuBbOEog%40mail.gmail.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/c00991f9-4c8c-49af-8b48-0a5a09865b68n%40googlegroups.com.