Obecně
Django - obecná témata
Obsah stránky (hide)
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.