算到現在,已經有將近半年沒有寫過技術文章了,手癢癢,于是拿Django來說事,希望最終的產出能夠做成一個簡短易懂的Django快速起步,讓初次接觸Django的朋友能夠在最短的時間內了解Django的基本概念和結構。
Django是使用Python實現的一個基于MVC的web應用框架,類似Ruby世界的Ruby on
Rails。如果你是通過Google搜到這篇文章,那么說明你已經對Django有所耳聞,并且愿意了解更多Django相關的信息。我在這里就不多廢
話Ruby vs Python或者Rails vs Django,直奔主題。
在寫這篇文章時,最新的CPython版本為2.5.1,Django版本為0.96,如無特別說明,本文所有介紹和示例均以此環境為準。
0- 在開始之前,首先當然是安裝一個基本能用的開發環境。
如果你的操作系統是Linux或者其他類Unix系統,很可能已經預裝了Python,可以在命令行執行python -V查看Python版本。如果你是Windows操作系統,或者想嘗試不同版本的Python,那么可以到
http://www.python.org/下載相應的安裝包進行安裝。
有了Python以后,到
http://www.djangoproject.com/下載Django,解壓以后,cd到解壓出來的目錄,執行python setup.py install。
為了能夠做出一個基本的多層web應用,還需要安裝一個數據庫,如果沒有特別喜好和偏向,推薦PostgreSQL,可以在
http://www.postgresql.org/找到合適的版本下載和安裝。
我們還缺少一個數據庫驅動,在
http://www.initd.org/pub/software/psycopg/可以找到用于連接PostgreSQL的psycopg2,安裝方法類似Django。
1- django-admin.py startproject
所有環境OK以后,我們開始動手把玩Django,首先找一個干凈的目錄,執行
$ python django-admin.py startproject hello
上面這行命令會新建一個hello子目錄,包含以下文件:
__init.py__: 表示該目錄存放Python程序
manage.py: 提供Django項目相關的管理操作
settings.py: 相當于該Django項目的全局設置
urls.py: 用于配置URL映射,基本上就是通過正則表達式指定不同URL由相應的view方法相應
2- manage.py runserver
至此我們已經搭起了一個基本的Django項目框架,執行
$ python manage.py runserver
命令行會提示在8000端口運行一個開發用的web server,轉到瀏覽器的
http://localhost:8000/即可看到It worked!的提示信息。你也可以指定端口號,方法是python manage.py runserver XXXX。
3- settings.py
接下來我們做一個完整的從model/數據庫到view/template的例子。修改settings.py:
DATABASE_ENGINE?=?'postgresql_psycopg2'
DATABASE_NAME?=?'hello'?#?Your?db?name
DATABASE_USER?=?'postgres'?#?Your?db?user
DATABASE_PASSWORD?=?'********'?#?Your?db?password
DATABASE_HOST?=?''
DATABASE_PORT?=?''
INSTALLED_APPS?=?(
????'django.contrib.auth',
????'django.contrib.contenttypes',
????'django.contrib.sessions',
????'django.contrib.sites',
????'hello',?#?Our?new?project
)?
4- models.py
新建models.py:
from?datetime?import?datetime
from?django.db?import?models
class?Book(models.Model):
????isbn????????=?models.SlugField(maxlength=20)
????title???????=?models.CharField(maxlength=200)
????author??????=?models.CharField(maxlength=200)
????description?=?models.TextField(blank=True,null=True)
????published???=?models.DateTimeField(default=datetime.now)
這里我們從django.db.models.Model繼承我們的model類Book,同時還用到了models中現成的字段類,如
SlugField、CharField、TextField、DateTimeField等。大家比較陌生的恐怕是SlugField,這個基本上類似
CharField,不過增加了其內容需要符合URL要求的限制條件。
執行下面的命令測試數據庫腳本的生成:
$ python manage.py sql hello
應該看到如下輸出結果:
BEGIN;
CREATE TABLE "hello_book" (
"id" serial NOT NULL PRIMARY KEY,
"isbn" varchar(20) NOT NULL,
"title" varchar(200) NOT NULL,
"author" varchar(200) NOT NULL,
"description" text NULL,
"published" timestamp with time zone NOT NULL
);
COMMIT;
確認無誤后可以通過下面的命令提交到數據庫:
$ python manage.py syncdb
其間會要求我們創建一個管理員賬號,如果暫時不打算做admin頁面,可以跳過。
5- views.py
model有了之后,接下來我們就可以開始畫視圖了。由于篇幅和時間有限,我僅簡單介紹一下Django的template,然后實現一個最基本的圖書清單頁面。
首先定義圖書清單的URL,在urls.py中:
from?django.conf.urls.defaults?import?*
urlpatterns?=?patterns('hello.views',
????(r'^hello/books/$',?'book_list'),
)
含義為hello/books/這個URI資源對應的相應view方法為hello.views.book_list。
新建templates目錄,然后新建books.html:
<html??xmlns="http://www.w3.org/1999/xhtml"?lang="zh-cn"?xml:lang="zh-cn">
<head>
<title>{{?title|escape?}}</title>
</head>
<body>
<h2>{{?title?}}</h2>
<table?border="1">
??<tr><th>ISBN</th><th>書名</th><th>作者</th><th>出版日期</th></tr>
??{%?for?book?in?books?%}
??<tr>
????<td>{{?book.isbn?}}</td>
????<td>{{?book.title?}}</td>
????<td>{{?book.author?}}</td>
????<td>{{?book.published?}}</td>
??</tr>
??{%?endfor?%}
</table>
</body>
</html>
Django模板的語法是{{}}表示引用,{%%}表示代碼,使用起來也很直觀,甚至支持UNIX風格的filter,如這里的{{ title|escape }}。
新建views.py:
from?hello.models?import?*
from?django.shortcuts?import?render_to_response
def?book_list(request):
????title?=?'Book?List'
????books?=?Book.objects.all()
????return?render_to_response('books.html',?{'title'?:?title,?'books'?:?books})
最終頁面上的內容,通過title和books兩個參數傳遞給tempate(books.html)處理。
修改settings.py:
TEMPLATE_DIRS?=?(
????'/opt/PROJECTS/Django/hello/templates/',
)
指定templates目錄位置,注意需要使用絕對路徑和'/',無論是Unix還是Windows系統。
我們手工造一些數據之后,就可以通過
http://localhost:8000/hello/books/訪問我們用Django實現的這個簡單頁面了。
6- What's next
通過上面的簡單介紹,相信哪怕是初次接觸Django的朋友,也能夠對Django有一個初步的認識。其實Django并不難學,并且隨著學習的深入,你一定能發現更多的驚喜,不論是來自Django本身,還是Python及其龐大的第三方類庫。
如果有時間,建議嘗試一下Django的admin pages,即為我們的model提供自動化、網頁化的增刪改查操作。啟用方法如下:
修改models.py (增加class Admin):
from?datetime?import?datetime
from?django.db?import?models
class?Book(models.Model):
????isbn????????=?models.SlugField(maxlength=20)
????title???????=?models.CharField(maxlength=200)
????author??????=?models.CharField(maxlength=200)
????description?=?models.TextField(blank=True,null=True)
????published???=?models.DateTimeField(default=datetime.now)
????class?Admin:
????????pass
修改settings.py和urls.py,加入admin支持:
[settings.py]
INSTALLED_APPS?=?(
????'django.contrib.auth',
????'django.contrib.contenttypes',
????'django.contrib.sessions',
????'django.contrib.sites',
????'django.contrib.admin',
????'hello',
)
[urls.py]
urlpatterns?=?patterns('hello.views',
????(r'^hello/books/$',?'book_list'),
????(r'^hello/admin/',?include('django.contrib.admin.urls')),
)
Note:
# 為了成功運行admin pages,需要首先執行python manage.py syncdb admin以創建django_admin_log表。
# 如果前面跳過了創建管理員步驟,簡單的方法可以刪掉auth_user表,然后python manage.py syncdb重建。
按照我們urls.py的配置,admin pages可以通過
http://localhost:8000/hello/admin/訪問。Enjoy!