2012-12-20

'쉽고 빠른 웹개발 Django' 버전 1.4 이상에서 진도나가기



'쉽고 빠른 웹개발 Django'은 1.0버전 기준이어서 최신버전 (1.4.3)에서 막히면 진도를 더이상 나갈 수 없게 됩니다. 이에, 최신 버전에서도 진행할 수 있도록 변경된 부분을 반영하여 수정본을 작성해보았습니다. 1.4 이후 부터 디렉토리 구조가 조금 변경이 되었는데, 대부분 이 것 때문에 기존버전과 맞지 않는 부분이 생기는 것입니다. 추후 더 변경할 것이 발견되면 추가하도록 하겠습니다.

P. 15

Before
django_bookmarks/
    __init__.py
    manage.py
    settings.py
    urls.py
After
django_bookmarks/
    manage.py
    django_bookmarks/
        __init__.py
        settings.py
        urls.py
        wsgi.py

P. 17

Before
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'bookmarksdb'
DATABASE_USER = ''
DATABASE_PASSWORD = ''
DATABASE_HOST = ''
DATABASE_PORT = ''
After
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'bookmarksdb',                  # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

P.30

Before
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django_bookmarks.bookmarks',
)
After
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'bookmarks',
)

P. 37

Before
import os.path
 
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates'),
)
After
import os
SETTINGS_DIR = os.path.abspath(os.path.dirname(__file__))
(SITE_ROOT, dummy) = os.path.split(SETTINGS_DIR)
 
TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates'),
)

P. 48

Before
...
<form method="post" action=".">
...
After
...
<form method="post" action=".">{% csrf_token %}
...

P. 55

Before
import os.path
 
site_media = os.path.join(
    os.path.dirname(__file__), 'site_media'
)
After
import os
 
URLS_DIR = os.path.abspath(os.path.dirname(__file__))
(SITE_ROOT, dummy) = os.path.split(URLS_DIR)
site_media = os.path.join(SITE_ROOT, 'site_media')

P. 58

Before
from django import newforms as forms
After
# -*- coding: utf-8 -*-
from django import forms

2012-12-14

Ramaze Simple Tutorial 2 (with Sequel)



이 튜토리얼에서는 migration 을 사용하지 않고, Model 에서 직접 스키마를 작성하고 Table 을 생성하도록 하였다. 그리고, Ramaze (2012.12.08) 에서 테스트를 진행하였다.

  • 관련 모듈 설치
    $ apt-get install libsqlite3-dev sqlite3
    $ gem install ramaze sequel thin sqlite3
    
  • 프로젝트 생성
    $ mkdir -p /opt/project/ramaze
    $ cd /opt/project/ramaze
    $ ramaze create web
    
  • 기본 웹서버 변경 -> task/ramaze.rake 에서 :webrick 을 :thin 으로 수정
  • 웹서버 시작 테스트
    $ cd /opt/project/ramaze/web
    $ thin start
    
  • db / model 폴더 생성
    $ cd /opt/project/ramaze/web
    $ mkdir -p db
    $ mkdir -p model
    
  • app.rb 에 다음 추가
    require 'sequel'
    
    # Open the accounts database
    DB = Sequel.connect('sqlite://db/web.db')
    
    # Initialize controllers and models
    require __DIR__('model/init')
    require __DIR__('controller/init')
    
  • model/init.rb 에 다음 추가
    require __DIR__('admin')
    
  • model/admin.rb 생성
    # coding : utf-8
    require 'sequel'
    
    class Admin < Sequel::Model(:admins)
      plugin :schema
      
      set_schema do
        primary_key :id
    
        String :login, :unique => true, :empty => false
        String :password, :empty => false
        String :name
        String :email
        String :mobile_phone
        String :level, :default => '00'
      end
    
      # Create the database table if it doesn't exists
      # Also add a admin
      if ! table_exists?
        create_table
        create :login => 'hong', :password => 'hong1234', :name => '홍길동', :email => 'hong@test.com', :mobile_phone => '010-5555-5555', :level => '00'
        create :login => 'jang', :password => 'jang1234', :name => '장영실', :email => 'jang@test.com', :mobile_phone => '010-6666-6666', :level => '01'
      end
    end
    
  • controller/init.rb 에 다음을 추가
    require __DIR__('admin')
    
  • controller/admin.rb 생성
    class AdminController < Controller
      map '/admin'
      def index
        'Admin Test'
      end
    end
    
  • 프로젝트를 실행하고 브라우저에서 http://localhost:3000/admin 을 접근해본다.
  • 이제, controller/admin.rb 의 index 를 다음과 같이 변경한다.
      def index
        @admins = Admin.all
      end
    
  • view 디렉토리 생성
    $ cd /opt/project/itsm_ramaze/web/view
    $ mkdir admin
    
  • view/admin/index.xhtml 생성
    <h1> Admin Test Page </h1>
    <?r @admins.each do |admin| ?>
      #{admin.login}
      #{admin.name}
      #{admin.email}
      #{admin.mobile_phone}
      #{admin.level}
      <br/>
    <?r end ?>
    
  • 프로젝트를 실행하고 브라우저에서 http://localhost:3000/admin 을 접근해서 데이터 목록이 뜨면 정상이다.