Django

Obecně

Django - obecná témata

1.  Virtualenvwrapper a settings jako modul

Místo settings.py jakou soubor máme

 project/settings/
    __init__.py
    base.py
    devel.py

kde devel.py:

    from base import *
    NECO = "hudly hudly"

Jak nemuset zadávat na příkazové řádce stále dokolečka parametr "--settings=project.settings.devel"? Do manage.py přidáme to tučné:

 #manage.py
 ...
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.devel")

2.  Apache2 ITK a wsgi - problém s přístupovými právy

Na fórech celkem běžná otázka. ITK umožňuje spouštět jednotilvé virtual hosty pod vlastním uživatelem a skupinou. Wsgi soket (/var/run/apache2/wsgi... na Debianu) běží pod uživatelem www-data a práva k soketu jsou 700. Z toho plyne, že virtual host, který neběží pod uživatelem www-data nemůže k soketu přistupovat.

Bohužel jsem nepřišel na to, jak nastavit práva k soketu. Mod-wsgi to v konfiguraci neumožňuje(?!). Kdyby šlo dát 744 místo 700, bylo by po starosti. Když se to nastaví ručně, vystačí to jen do dalšího reload Apache serveru, a pak je tam zpátky 700.

Já to vyřešil tak, že jsem uživatele www-data přidal do skupiny, pod kterou běží virtual host s Djangem. Určitě to nepokryje všechny možné případy, ale berme to jako jedno z možných řešení.

3.  Ladění

Jedeme-li na skutečném web serveru, pak je po změnách v programu potřeba "restartovat" server:

 $ touch ./my_project/wsgi.py

(je to furt lepší, než kdybychom museli reloadnout Apache)

4.  Čas a časová pásma

Čas zadaný uživatelem se do databáze (prý) ukládá v UTC. Já jsem si ověřil, že se uloží jako LocalTime s TimeZone. Například užvatel v Česku v zimě zadá 12:10:25. V databázi se to objeví jako 12:10:25 +1. ALE po načtení z databáze nám vyleze 11:10:25<UTC>.

Pokud chceme dostat správný čas, použijeme modul timezone z django.utils:

 from django.utils import timezone

 view_func(request):
     mod = Model.objects.get(pk=1)
     when = timezone.localtime(mod.timeitem)

Jestli tomu dobře rozumím, tak databáze se snaží být univerzální (platná po celém světě). Zaznamenaný čas s časovou zónou je přepočtem toho co poslal uživatel z formuláře (bez ohledu na jeho časové pásmo) na server (např. 11:00). Server převezme časový údaj jak je a opatří jej časovým posunem lokálního času časové zóny, která je nastavena v settings.TIME_ZONE (tj 11:00 +1). Tak to taky uloží do databáze.

Při načtení z databáze ale musíme použít funkci timezone. Proč se to nepřepočte automaticky zatím nevím. Třeba na to časem přijdu. :-) (teď je 6.11.2013)

V settings.py je taky parametr USE_TZ. Nastavíme-li ho na False, budou se časové údaje ukládat bez časové zóny tak, jak byly zadány. U projektů, kde to nevadí (a těch může být hodně) to může být významné zjednodušení.

5.  Vložení výstupu s Djanga do PHP skriptu

Může se stát, že máme web v PHP, ale chce do něj načíst výstup z Django aplikace.

1. V Apache, VirtualHost přidat direktivu pro povolení url adres v příkazu include

 php_admin_flag  allow_url_include on

2. V PHP skriptu dát

 <?php include "http://django.example.com/aplikace/vystup_pro_php/" ?>

3. V Djangu udělat šablonu s html výstupem atd...

Zkoušel jsem to přes html tag iframe, ale to je dneska tak zabezpečná věc, že to skoro nejde použít.