All posts by Tomislav Vlahović

Django south

South je aplikacija za Django koja prati promjene Django Modela i zapisuje te promjene u bazu.
npr. model Korisnik ima polja: Ime i Prezime dužine 10 znakova.
Kasnije se pokaže da je to pre malo znakova.
Bez south aplikacije bi morali ručno promjeniti polja u bazi.
South nam omogućava da promjene vršimo direktno u modelima.

$ easy_install south

Naredba za instalaciju
Moramo dodati ‘south’ u INSTALLED_APPS u settings.py

$ python.py manage.py schemamigration app_name --initial

Napravimo inicijalnu migraciju, tj. snimimo postojeće stanje.

$ python.py manage.py syncdb

Moramo pokrenuti ‘syncdb’ jer south dodaje svoje tablice u bazu.
Redoslijed je bitan, jer ako pokrenemo syncdb prije schemamigration, syncdb ce zapisati tablice u bazu i south neće moći kreirati tablice, jer već postoje..

$ python.py manage.py migrate app_name

Naredba koja zapiše promjene modela u bazu. (Kreira ih, modificira, briše…)

$ python.py manage.py schemamigration app_name --auto

Nakon što napravimo promjene u Modelu pokrećemo south koji detektira razlike i zapisuje ih.

Validation

// Provjeri da li je vrijednost nešto smisleno, npr da li je array pun
if (typeof array[index] !== 'undefined' && array[index] !== null) { }

/* VALIDATION */

/*
 * If the value is null and not required, we don't need to run through validation
 */
if (!field.value || field.value === '' || typeof field.value === 'undefined') {
    return;
}
// Regex za validation !!
var ruleRegex = /^(.+)\[(.+)\]$/,
        numericRegex = /^[0-9]+$/,
        integerRegex = /^\-?[0-9]+$/,
        decimalRegex = /^\-?[0-9]*\.?[0-9]+$/,
        emailRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i,
        alphaRegex = /^[a-z]+$/i,
        alphaNumericRegex = /^[a-z0-9]+$/i,
        alphaDashRegex = /^[a-z0-9_-]+$/i,
        naturalRegex = /^[0-9]+$/i,
        naturalNoZeroRegex = /^[1-9][0-9]*$/i,
        ipRegex = /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/i,
        base64Regex = /[^a-zA-Z0-9\/\+=]/i;
// Koristi se: npr.:   emailRegex.test('tvlahovi@gmail.com')    -> Vraca true ili false

Django WSGI Apache

Kreirati projekt.com.conf i prebaciti ga u /etc/httpd/conf.d

Konfiguracija:

Listen 8000

WSGISocketPrefix /var/run/wsgi


ServerName gandalf.local

Alias /static /vault0/podaci/_razvoj/webapps/is42/static
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

WSGIDaemonProcess is.dizajnzona42.com display-name=%{GROUP} python-path=/vault0/podaci/_razvoj/webapps/is42:/vault0/podaci/_razvoj/webapps/venv/is.dizajnzona42.com/lib/python2.7/site-packages
WSGIProcessGroup is.dizajnzona42.com

WSGIScriptAlias / /vault0/podaci/_razvoj/webapps/is42/is42/wsgi.py


    
        Order deny,allow
        Allow from all
    



 

Django virtualenv setup

Imamo aplikacije koje koriste različite verzije Djanga, kako napraviti da se sve vrte na istom serveru?
Pomoću virtualenv softvera.

Instaliramo python setuptools.

$ yum install python-setuptools

Nakon što smo instalirali setuptools, instaliramo virtualenv.

$ easy_install virtualenv

Preselimo se u direktorij gdje cemo pospremati virtualne instalacije.

$ cd ~/webapps/venv
$ virtualenv --no-site-packages projekt.com
$ source projekt.com/bin/activate
(projekt.com)$ pip install django
(projekt.com)$ deactivate

Ako trebamo verziju djanga koju nije moguce instalirati preko pipa, onda je procedura da se instalacijski paket skine sa interneta i standardnom procedurom instalira u virtualno okružje.
npr.

$ source projekt.com/bin/activate
(projekt.com)$ pip install django
(projekt.com)$ wget https://www.djangoproject.com/download/1.5c1/tarball/
(projekt.com)$ tar xzvf Django.tar.gz
(projekt.com)$ cd Django
(projekt.com)$ python setup.py install

Postgres Performance

Vrijedi za PG v9.2
CREATE extension pg_stat_statements;

Ukljući sakupljane statistike o upitima.

SELECT (total_time / 1000 / 60) as total_minutes,
       (total_time/calls) as average_time,
       query
FROM pg_stat_statements
ORDER BY 1 DESC
LIMIT 100;

Upit prikazuje:
1. Koliko se dugo upit odvijao na serveru (ukupno)
2. Koliko se prosjećno upit odvijao na serveru (milisekunde)
3. Sam upit

SELECT sum(heap_blks_read) as heap_read,
       sum(heap_blks_hit) as heap_hit,
       (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio
FROM pg_statio_user_tables;

Upit prikazuje Cache hit rate, 99% je ciljano.

SELECT relname,
       100 * idx_scan / (seq_scan + idx_scan) percent_of_times_index_used,
       n_live_tup rows_in_table
FROM pg_stat_user_tables
WHERE seq_scan + idx_scan > 0
ORDER BY n_live_tup DESC;

Korištenje Indexa na tablici. 99% na tablici sa preko 10.000 redova, sve ispod toga treba istražiti i dodati nove indexe.

Izvori:
http://craigkerstiens.com/2012/10/01/understanding-postgres-performance/
http://craigkerstiens.com/2013/01/10/more-on-postgres-performance/