티스토리 툴바


nginx 상에서 uWSGI로 Django 돌려보기

centos 에서는 파이썬2.4가 기본설치되어 있다. 난 파이썬 2.7 기반으로 쓰기 위해 nginx 를 직접 소스 설치하였다.

python2.7 을 소스설치하고 각종 라이브러리를 설치하는 것은 본 아티클에서 다루지 않는다.

시스템 환경

  • kt ucloud cs, CentOS release 5.6 (Final)

참고사이트

세팅 예

uwsgi/nginx 계정 생성

sudo /usr/sbin/useradd -M -r --shell /bin/sh --home-dir /opt/uwsgi uwsgi
sudo /usr/sbin/useradd -M -r --shell /sbin/nologin --home-dir /opt/nginx ngin

django 홈디렉토리 설정

django-admin.py startproject /var/www/example_com
mkdir /var/www/example_com.python-egg
sudo chown -R uwsgi:uwsgi /var/www/example_com.python-egg

uWSGI 설치

#
# python2.7 용으로 uwsgi 빌드
#

wget http://projects.unbit.it/downloads/uwsgi-0.9.7.2.tar.gz
tar xvfz uwsgi-0.9.7.2.tar.gz
mv uwsgi-0.9.7.2 /opt/uwsgi
cd uwsgi
python2.7 setup.py build
cp Makefile.Py27 Makefile
make

sudo chown -R uwsgi:uwsgi /opt/uwsgi
sudo touch /var/log/uwsgi.log
sudo chown uwsgi /var/log/uwsgi.log

#
# /etc/init.d/uwsgi 에서 쓸 환경변수 등록
#

# create /etc/default/uwsgi
PYTHONPATH=/var/www/example_com
MODULE=wsgi_configuration_module
daemon_name=uwsgi

#
# /etc/init.d/uwsgi 스크립트 등록
#

# 127.0.0.1:9001 로 구동되도록 설정되어 있음
wget -O init-rpm.sh http://library.linode.com/assets/701-init-rpm.sh
sudo mv init-rpm.sh /etc/init.d/uwsgi
sudo chmod +x /etc/init.d/uwsgi

sudo /sbin/chkconfig uwsgi on

nginx 소스 설치

#
# 필요한 팩키지 설치
#
sudo yum install pcre pcre-devel

#
# nginx 빌드/설치
#
wget http://nginx.org/download/nginx-1.0.2.tar.gz
tar xvfz nginx-1.0.2.tar.gz
cd nginx-1.0.2
./configure --prefix=/opt/nginx --user=nginx --group=nginx
make
sudo make install

#
# /etc/init.d/nginx 스크립트 등록
#
wget -O init-rpm.sh http://library.linode.com/assets/662-init-rpm.sh
sudo mv init-rpm.sh /etc/rc.d/init.d/nginx
sudo chmod +x /etc/rc.d/init.d/nginx
sudo /sbin/chkconfig nginx on

nginx 설정예 : /opt/nginx/conf/nginx.conf

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include               mime.types;
    default_type          application/octet-stream;

    sendfile              on;
    keepalive_timeout     65;

    server {
        listen            80;
        server_name       localhost;

        access_log        logs/example_com/access.log;
        error_log         logs/example_com/error.log;

        location /static {
            alias         /var/www/example_com/staticfiles;
            expires         max;
        }
        location /static/admin {
            alias         /opt/python2.7.1/lib/python2.7/site-packages/django/contrib/admin/media;
            expires         max;
        }
        location / {
            uwsgi_pass    127.0.0.1:9001;
            include       uwsgi_params;
        }

        error_page 500 502 503 504 /500.html;
        error_page 404 /404.html;
    }
}

서비스 구동

sudo /etc/init.d/uwsgi start
sudo /etc/init.d/nginx start
트랙백0 댓글0

변경된 필드만 update 하기

django model 을 통해 save를 수행할 때에는, 모든 필드의 값이 update 쿼리를 통해 수행됩니다.

필드갯수가 적을 때에는 상관없지만, 필드갯수가 많아지거나, Low-Performance 임베디드 장비의 경우에는 성능에 치명적일 것입니다.

from django.db import models

class ChangedOnlySaveModel(models.Model):
    def __init__(self, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self._initial_data = self.__dict__.copy()

    def save(self, commit=True):
        if not self.pk:
            models.Model.save(self, commit)
        else:
            changed = []
            for k, v in self._initial_data.iteritems():
                if (v != self.__dict__[k]) and (k != '_initial_data'):
                    changed.append((k, v))
            if len(changed) > 0:
                self.__class__.objects.filter(pk=self.pk).update(**dict(changed))
                self._initial_data = self.__dict__.copy()

    class Meta:
        abstract = True

Example

from django.db import connection

class Post(ChangedOnlySaveModel):
    title = models.Charfield(max_length=100)
    content = models.TextField()

Post(title='title', content='content').save()

#

post = Post.objects.all()[0]
post.content = 'Hello World'
post.save()
print connection.queries

출력결과

[{'time': '0.001', 'sql': u'UPDATE "phone_post" SET "content" = content WHERE "phone_post"."id" = 1 '}]

실제로 임베디드 리눅스 상에서 django 어플리케이션을 돌리는데, 본 코드 덕을 좀 봤습니다. 후훗. :-)

트랙백0 댓글0

함수호출로 열 편집모드 실행하기

extjs4 beta1 기준

extjs4 의 GridPanel 에서는 마우스 이벤트에 의해서만 열 편집모드가 실행됩니다. 하지만 ContextMenu 를 둬서, "편집" 메뉴를 둬서 클릭시에 열 편집모드를 실행할려고 하면, 흠 -_-;;;

extjs4 소스코드를 뜯어본 결과, 다음과 같이 수정하면 가능하군요. 예전 포스팅 의 코드를 조금 수정해봤습니다.

var editor = new Ext.grid.RowEditing({
    pluginId: 'row_editor'
});

var grid = new Ext.grid.GridPanel({
    plugins: editor
    ,headers: [
        { text: 'id', dataIndex: 'id' }
        ,{ text: 'Name', dataIndex: 'id', field: {xtype:'textfield'} }
    ]
});

function doEditing() {
    grid.getPlugin('row_editor').onEnterKey();
}

이제 doEditing() 함수만 호출해주면, 열 편집모드가 바로 실행됩니다.

트랙백0 댓글0
prev 1 2 3 4 5 ... 6 next