[Django] Web Framework- Django -初階學習心得

django-logo-negative_1236046419 (by appleboy46) 首先感謝 酷學園團隊Who’s Who 工作坊自由軟體鑄造場 舉辦的一系列南部的 pythonDjango 活動,今天的活動主題是:Web Framework- Django -初階 (講者:陳建玎),簡介了為什麼需要 MVC 架構寫法,MVC 的重要性,以及 Django 的優點,還蠻豐富的課程,其實重點都是在如何使用 MVC 加速開發 Web 網站,以及在 Team Work 裡的重要性,目前在開發 Web Framework 都是利用 PHP 一套 Frame Work:Codeigniter,在台灣已經有中文網站:CodeIgniter 繁體中文,自己接手了 CodeIgniter 計畫翻譯中文文件,還有開發 forum 中文討論區,還在規劃中,自己也才摸 CodeIgniter 一個多禮拜,底下有一張上課的投影片,介紹三種 Frame Work 的 Model、Views、Controller django (by appleboy46) django_01 (by appleboy46) 上面兩張投影片把 Django MVC 的精華都講出來了,Model 在 Frame Work 裡面就是跟 database 互相溝通,View 部份就是設計基本的 html 架構,把簡單的 while、for 的語法寫到 Template 裡面。使用者 Browser 對伺服器要求 Request,Django 就會針對 url 呼叫 urls.py,urls.py 裡面就寫著相對應的結構,如下:
from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/(.*)', admin.site.root),
    # (r'^admin/', include('django.contrib.admin.urls')),
    (r'news/', 'mysite.hellowordapp.startpage'),
    (r'^$', 'mysite.hellowordapp.startpage'),
)
urls.py 裡面會寫基本的 Regular Expression 對應到 project 檔案,基本的 Regular Expression 要會一點,不管是哪一套 MVC,都需要用到 Regular Expression,在 Codeigniter PHP Framework 架構裡面對應的是 application/config/routes.php 的 URI Routing,接下來就是 View(COntroller),最後就是 model 呼叫了,其實最主要就是達到程式與樣板的分離,以及 database 跟 controller 的分開,對於程式人員跟美工人員相互合作,這個方式是最好的。 底下來快速介紹如何實作出線上新聞發佈系統,上課老師是把環境建立在 Windows 底下,不過我發現底下很多學員都是 run 在 Linux 底下,而我自己是弄在 FreeBSD 系統上面,其實做法都差不多,ubuntu 用 apt-get 方式,Fedora 是用 yum,FreeBSD 是用 ports 的方式,不管熟悉哪一種都可以輕鬆上手,run 在 Windows 上面也蠻方便的,一切都是看個人習慣了。 首先 FreeBSD ports 安裝: 課程上的很充實,需要投影片或者是範例的,都可以到 Web Framework- Django -初階 (講者:陳建玎) 上面觀看或者是下載,另外也有 wiki,大家上課的筆記都可以寫在上面喔。
#
# 目前版本 py25-django-1.0.2
# maintainer lwhsu@FreeBSD.org
cd /usr/ports/www/py-django
# make showconfig
make install clean
FreeBSD 會依序幫您裝好相關套件,MySQL、SQLite3、POSTGRESQL、MOD_PYTHON3(Install Apache2 with mod_python3),這些是 ports 的 config 選單是可以自由選擇。 接下來介紹快速使用 Django 開發一個新聞系統,介紹如何使用 Django 強大後台,上課過程老師是教大家先建立 model 再使用 manager syncdb tool 建立 database 資料表,那我來寫反向教學,先建立資料表,在利用 inspectdb tool 產生 model 資訊,自己通常都是用 MySQL 先建立好該有的資料表,這樣會比較方便。 1. 建立專案
#
# 在任何目錄底下都可以使用這個指令
django-admin.py startproject mysite
底下會出現幾個檔案:settings.py、urls.py、manage.py,大概介紹一下這三個檔案的用途,settings.py 用來設定系統參數,如:連接資料庫類型,帳號,密碼,urls.py 用來處理網址列導向,需要基本正規語言知識,manage.py 管理整個 Django 專案工具,可以鍵入 python manage.py help 來查看如何使用。 2. 建立 app # # 在 mysite(剛剛建立的專案)底下新增 app 名稱 python manage.py startapp news 3. 設定資料庫類型帳號密碼
#
# 打開 settings.py
#
DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'django'             # Or path to database file if using sqlite3.
DATABASE_USER = 'django'             # Not used with sqlite3.
DATABASE_PASSWORD = 'xxxx'         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
4. 建立資料表
CREATE TABLE IF NOT EXISTS `project_news` (
  `news_id` mediumint(8) NOT NULL AUTO_INCREMENT,
  `user_id` mediumint(8) NOT NULL,
  `group_id` mediumint(8) NOT NULL,
  `categories_id` int(4) NOT NULL,
  `news_name` varchar(255) NOT NULL,
  `news_desc` text NOT NULL,
  `news_top` tinyint(1) NOT NULL DEFAULT '0',
  `news_add_time` int(11) NOT NULL,
  `news_edit_time` int(11) NOT NULL,
  PRIMARY KEY (`news_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `project_news_categories` (
  `categories_id` mediumint(8) NOT NULL AUTO_INCREMENT,
  `categories_name` varchar(64) NOT NULL,
  `add_time` int(11) NOT NULL,
  `edit_time` int(11) NOT NULL,
  PRIMARY KEY (`categories_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
5. 利用 Django tool 產生系統帳號認證相關資料表
#
# 會依照 settings.py 裡面的 INSTALLED_APPS 設定產生相關資料表喔
python manage.py syncdb
另外反向作法:
#
# 可以產生全部在 database 裡面的 table 資料表,選取該對應您要的資料即可
python manage.py inspectdb
6. 開啟 admin 管理介面:設定 urls.py Django_2 (by appleboy46) 上面英文部份都寫得很清楚了,如果要打開 admin 功能必須要 unmark 掉哪幾行。 7. 新增 admin.py 到 app 資料夾裡頭,檔案內容:
from mysite.news2.models import ProjectNews, ProjectNewsCategories
from django.contrib import admin
admin.site.register(ProjectNews)
admin.site.register(ProjectNewsCategories)
修改 settings.py
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'mysite.news',
)
8. 啟動伺服器,內建 python manage tool 就可以辦到了
python manage.py runserver 0.0.0.0:8000
9. 打開瀏覽器:http://localhost:8000 或者是您的 ip 跟 domain 都可以上去 登入畫面: Django_3 (by appleboy46) 系統首頁: Site administration - Django site admin_1240799902399 (by appleboy46) 管理新聞畫面: Select project news to change - Django site admin_1240799942489 (by appleboy46) 新增新聞畫面: Change project news - Django site admin_1240799962251 (by appleboy46) 10. 修改新聞系統 ForeignKey
from django.db import models

# Create your models here.

class ProjectNews(models.Model):
    news_id = models.IntegerField(primary_key=True)
    user_id = models.IntegerField()
    group_id = models.IntegerField()
    #categories_id = models.IntegerField()
    categories = models.ForeignKey("ProjectNewsCategories")
    news_name = models.CharField(max_length=1020)
    news_desc = models.TextField()
    news_top = models.IntegerField()
    news_add_time = models.IntegerField()
    news_edit_time = models.IntegerField()
    class Meta:
        db_table = u'project_news'
    def __unicode__(self):
        return self.news_name


class ProjectNewsCategories(models.Model):
    categories_id = models.IntegerField(primary_key=True)
    categories_name = models.CharField(max_length=256)
    add_time = models.IntegerField()
    edit_time = models.IntegerField()
    class Meta:
        db_table = u'project_news_categories'
    def __unicode__(self):
        return self.categories_name
因為這檔案內容是依據 manage.py inspectdb 所產生的,系統並非知道我們所有 table 的關聯性,所以必須設定改掉部份關聯性,可以參考官方網站的教學 ForeignKey,介紹就到此了,後面有 template 的教學,不過就比較容易一點,就靠大家去摸索了,課程還蠻豐富的,認真玩,可以學到很多東西。 可以去下載課程講義喔:Web Framework- Django -初階 (講者:陳建玎)