nginx 상에서 uWSGI로 Django 돌려보기
분류없음 2011/05/12 23:43
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
변경된 필드만 update 하기
분류없음 2011/04/18 12:49
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 어플리케이션을 돌리는데, 본 코드 덕을 좀 봤습니다. 후훗. :-)
함수호출로 열 편집모드 실행하기
분류없음 2011/04/07 10:33
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() 함수만 호출해주면, 열 편집모드가 바로 실행됩니다.


