1. Django 설치하기

$ sudo apt-get install python-django

$ django-admin.py --version


2. Django 프로젝트 만들기

$ django-admin.py startproject django_example


3. Database 연동

$ vi django_example/settings.py


 12 DATABASES = {

 13     'default': {

 14         'ENGINE': ''django.db.backends.sqlite3',

 15         'NAME': 'exampledb',

 16         'USER': '',

 18         'PASSWORD': '',

 19         'HOST': '',

 20         'PORT': '',

 21     }

 22 }


$ python manage.py syncdb


4. 서버 실행

- 서버는 기본으로 8000 번 포트로 실행되므로 포트를 생략할 수 있다.

   $ python manage.py runserver <8000>


5. 프로젝트 만들기

$ python manage.py startapp example


6. view 작성

$ vi example/views.py


  1 # -*- coding: utf-8 -*-      (다국어 표현을 위한 주석)

  2

  3 # Create your views here.

  4 from django.http import HttpResponse

  5

  6 def main_page(request):

  7     output = '''

  8         <html>

  9         <head><title>%s</title></head>

 10         <body>

 11             <h1>%s</h1>

 12         </body>

 13         </html>

 14     ''' % (

 15         'Django Example',

 16         'Hello World !!'

 17     )

 18     return HttpResponse(output)


7. URL 과 view 매핑

$ vi django_example/urls.py


  1 from django.conf.urls import patterns, include, url

  2 from example.views import *

  3

  4 urlpatterns = patterns('',

  6     (r'^$', main_page),

  7 )


8. Model 만들기

- Model 에서 사용하는 Field type

   IntegerField

   TextField

   CharField

   DateTimeField

   EmailField

   URLField

   FileField


- Department 모델 만들기

   $ vi example/models.py


  1 from django.contrib.auth.models import User

  2 from django.db import models

  3

  4 class Department(models.Model):

  5     department_name = models.TextField()

  6     user = models.ForeignKey(User)


- settings 파일에 INSTALLED_APPS 에 APP 을 등록하여 model 활성화

   $ vi django_example/settings.py


116 INSTALLED_APPS = (

117     'django.contrib.auth',

118     'django.contrib.contenttypes',

119     'django.contrib.sessions',

120     'django.contrib.sites',

121     'django.contrib.messages',

122     'django.contrib.staticfiles',

123     'example',

128 )


- Model DB 테이블 생성

   $ python manage.py syncdb


- DDL 문 SQL 확인

   $ python manage.py sql example


- Data 저장 및 확인

   $ python manage.py shell


>>> from example.models import *

>>> from django.contrib.auth.models import User

>>> User.objects.all()


>>> user = User.objects.get(id=1)

>>> print user

>>> dir(user)


>>> department1 = Department(department_name='Cloud Team', user=user)

>>> department1.save()


9. Template 만들기

- template 디렉토리 지정하기

   $ mkdir -p templates

   $ vi django_example/settings.py


  3 import os.path

     ...

112 TEMPLATE_DIRS = (

113     os.path.join(os.path.dirname(__file__), '../templates'),

114 )


- template 파일 만들기

   $ vi templates/main_page.html


  1 <html>

  2 <head><title>{{ title }}</title></head>

  3 <body>

  4     <h1>{{ greeting }}</h1>

  5 </body>

  6 </html>


- view 파일 수정

   $ vi example/views.py


  1 # -*- coding: utf-8 -*-

  2

  3 from django.http import HttpResponse

  4 from django.template import Context

  5 from django.template.loader import get_template

  6

  7 def main_page(request):

  8     template = get_template('main_page.html')

  9     variables = Context({

 10         'title': 'My Example',

 11         'greeting': 'Hello Stephen !!',

 12     })

 13     output = template.render(variables)

 14     return HttpResponse(output)


10. 복잡한 화면 만들기

- url 을 user/username 형식으로 매핑 (username 은 stack 이라는 user 명을 사용)

   $ vi django_example/urls.py


  8 urlpatterns = patterns('',

  9     (r'^$', main_page),

 10     (r'^user/(\w+)/$', user_page),

 11 )


- view 를 수정

   $ vi example/views.py


  3 from django.contrib.auth.models import User

  4 from django.http import Http404


 18 def user_page(request, username):

 19     try:

 20         user = User.objects.get(username=username)

 21     except:

 22         raise Http404('Cant not found user')

 23

 24     dept = user.department_set.all()

 25

 26     template = get_template('user_page.html')

 27     variables = Context({

 28         'username': username,

 29         'department': dept,

 30     })

 31     output = template.render(variables)

 32     return HttpResponse(output)


- page 생성

   $ vi templates/user_page.html


  1 <html>

  2 <head><title>User: {{ username }}</title></head>

  3 <body>

  4     <h1>{{ username }}'s Department</h1>

  5     {% if department %}

  6         <ul>

  7             {% for dept in department %}

  8                 <li>{{ dept.department_name }}</li>

  9             {% endfor %}

 10         </ul>

 11     {% else %}

 12         <p>There's is no department</p>

 13     {% endif %}

 14 </body>

 15 </html>





Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG Django, Python

I. import 모듈

import eventlet.patcher
eventlet.patcher.monkey_patch()

import eventlet.db_pool
import sqlalchemy.orm
import sqlalchemy.pool

try:
    import MySQLdb
except ImportError:
    MySQLdb = None

II. orm sessionmaker 함수를 통한 session 생성

session = sqlalchemy.orm.sessionmaker(bind=engine,
                                                          autocommit=autocommit,
                                                          expire_on_commit=expire_on_commit)

III. sessionmaker의 첫번째 인수, bind 를 하기 위한 engine 을 생성하는 방법

engine = sqlalchemy.create_engine(FLAGS.sql_connection, **engine_args)

IV. create_engine을 하기 위한 engine_args dict 변수를 만드는 방법

engine_args = {
    "pool_recycle": FLAGS.sql_idle_timeout,
    "echo": False,
}
engine_args["pool_size"] = FLAGS.sql_max_pool_size
engine_args["pool_timeout"] = FLAGS.sql_pool_timeout
engine_args["creator"] = creator.create

V. creator (Connection Pool) 를 구하는 방법

creator = eventlet.db_pool.ConnectionPool(MySQLdb, **pool_args)

VI. ConnectionPool을 구하기 위한 pool_args 변수를 만드는 방법

# sqlalchemy.engine.url.make_url 을 이용하면 url 을 가지고 dict 형태로 변환이 가능하다.
connection_dict = sqlalchemy.engine.url.make_url(FLAGS.sql_connection)

pool_args = {
        "db": connection_dict.database,
        "passwd": password,
        "host": connection_dict.host,
        "user": connection_dict.username,
        "min_size": FLAGS.sql_min_pool_size,
        "max_size": FLAGS.sql_max_pool_size,
        "max_idle": FLAGS.sql_idle_timeout,
}





















 

Posted by Kubernetes Korea co-leader seungkyua@gmail.com
python 에서 argv 를 이용하여 args 를 동적으로 추가하고자 한다면 다음과 같이 사용

1. sys.argv[1:] 를 이용
   -  main 의 프로그램명을 제외한 cli 에서 입력한 argv 가 입력됨

2.  argparse.ArgumentParser.add_argument 를 이용하여 환경설정 값을 args 로 추가
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG args, argv, Python
일반적으로 노바의 로그는 /var/log/nova/nova-xxx.log 형태로 남는다.

/etc/nova/nova.conf 에 보면 logdir=/var/log/nova 로 되어 있어서 해당 디렉토리에 서비스 모듈명의 이름으로 로그가 남는데 이는 프로세스별로 로그를 만드는 것이다.

만약 사용자 정의의 로그를 만들고 싶으면 다음과 같이 수정한다.

# vi /usr/lib/pymodules/python2.6/nova/log.py

def setup():
...
    reset()
    _ask_setup_log()   // 추가
...
askLogger = logging.getLogger('nova.ask')
def _ask_setup_log():

    if FLAGS.logdir:

        logname = '%s.log' % (os.path.join(FLAGS.logdir, 'nova-ask'),)

        global askLogger

        askLogger = logging.getLogger('nova.ask')

        askLogger.propagate = 0

        askHandler = WatchedFileHandler(logname)

        askHandler.setFormatter(_formatter)

        askLogger.addHandler(askHandler)

 
# vi /usr/lib/pymodules/python2.6/nova/scheduler/chance.py

...
from nova import log as logging
...

    logging.askLogger.debug('********* %s, %s *************', context, topic)


이와 같이 수정하면 /var/log/nova/nova-ask.log 가 생성되며 어떤 프로세스에서 호출하던지 해당 로그에 남게 되어 있다.


novaclient 모듈에서 로그를 추가하고 싶으면 다음과 같이 하면 된다.

# vi /usr/lib/pymodules/python2.6/novaclient/log.py

import logging

from logging.handlers import WatchedFileHandler


logger = logging.getLogger('nova.client')

logger.setLevel(logging.DEBUG)

fh = WatchedFileHandler('/var/log/nova/nova-client.log')

formatter = logging.Formatter('%(asctime)s %(levelname)s %(name)s [-] %(message)s from (pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d')

fh.setFormatter(formatter)

logger.addHandler(fh)


# vi /usr/lib/pymodules/python2.6/novaclient/shell.py

...
from log import logger
...

logger.debug('******* shell.py called !! ****************')







 
Posted by Kubernetes Korea co-leader seungkyua@gmail.com