算到現(xiàn)在,已經(jīng)有將近半年沒有寫過技術(shù)文章了,手癢癢,于是拿Django來說事,希望最終的產(chǎn)出能夠做成一個(gè)簡短易懂的Django快速起步,讓初次接觸Django的朋友能夠在最短的時(shí)間內(nèi)了解Django的基本概念和結(jié)構(gòu)。
Django是使用Python實(shí)現(xiàn)的一個(gè)基于MVC的web應(yīng)用框架,類似Ruby世界的Ruby on
Rails。如果你是通過Google搜到這篇文章,那么說明你已經(jīng)對(duì)Django有所耳聞,并且愿意了解更多Django相關(guān)的信息。我在這里就不多廢
話Ruby vs Python或者Rails vs Django,直奔主題。
在寫這篇文章時(shí),最新的CPython版本為2.5.1,Django版本為0.96,如無特別說明,本文所有介紹和示例均以此環(huán)境為準(zhǔn)。
0- 在開始之前,首先當(dāng)然是安裝一個(gè)基本能用的開發(fā)環(huán)境。
如果你的操作系統(tǒng)是Linux或者其他類Unix系統(tǒng),很可能已經(jīng)預(yù)裝了Python,可以在命令行執(zhí)行python -V查看Python版本。如果你是Windows操作系統(tǒng),或者想嘗試不同版本的Python,那么可以到
http://www.python.org/下載相應(yīng)的安裝包進(jìn)行安裝。
有了Python以后,到
http://www.djangoproject.com/下載Django,解壓以后,cd到解壓出來的目錄,執(zhí)行python setup.py install。
為了能夠做出一個(gè)基本的多層web應(yīng)用,還需要安裝一個(gè)數(shù)據(jù)庫,如果沒有特別喜好和偏向,推薦PostgreSQL,可以在
http://www.postgresql.org/找到合適的版本下載和安裝。
我們還缺少一個(gè)數(shù)據(jù)庫驅(qū)動(dòng),在
http://www.initd.org/pub/software/psycopg/可以找到用于連接PostgreSQL的psycopg2,安裝方法類似Django。
1- django-admin.py startproject
所有環(huán)境OK以后,我們開始動(dòng)手把玩Django,首先找一個(gè)干凈的目錄,執(zhí)行
$ python django-admin.py startproject hello
上面這行命令會(huì)新建一個(gè)hello子目錄,包含以下文件:
__init.py__: 表示該目錄存放Python程序
manage.py: 提供Django項(xiàng)目相關(guān)的管理操作
settings.py: 相當(dāng)于該Django項(xiàng)目的全局設(shè)置
urls.py: 用于配置URL映射,基本上就是通過正則表達(dá)式指定不同URL由相應(yīng)的view方法相應(yīng)
2- manage.py runserver
至此我們已經(jīng)搭起了一個(gè)基本的Django項(xiàng)目框架,執(zhí)行
$ python manage.py runserver
命令行會(huì)提示在8000端口運(yùn)行一個(gè)開發(fā)用的web server,轉(zhuǎn)到瀏覽器的
http://localhost:8000/即可看到It worked!的提示信息。你也可以指定端口號(hào),方法是python manage.py runserver XXXX。
3- settings.py
接下來我們做一個(gè)完整的從model/數(shù)據(jù)庫到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,同時(shí)還用到了models中現(xiàn)成的字段類,如
SlugField、CharField、TextField、DateTimeField等。大家比較陌生的恐怕是SlugField,這個(gè)基本上類似
CharField,不過增加了其內(nèi)容需要符合URL要求的限制條件。
執(zhí)行下面的命令測試數(shù)據(jù)庫腳本的生成:
$ python manage.py sql hello
應(yīng)該看到如下輸出結(jié)果:
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;
確認(rèn)無誤后可以通過下面的命令提交到數(shù)據(jù)庫:
$ python manage.py syncdb
其間會(huì)要求我們創(chuàng)建一個(gè)管理員賬號(hào),如果暫時(shí)不打算做admin頁面,可以跳過。
5- views.py
model有了之后,接下來我們就可以開始畫視圖了。由于篇幅和時(shí)間有限,我僅簡單介紹一下Django的template,然后實(shí)現(xiàn)一個(gè)最基本的圖書清單頁面。
首先定義圖書清單的URL,在urls.py中:
from?django.conf.urls.defaults?import?*
urlpatterns?=?patterns('hello.views',
????(r'^hello/books/$',?'book_list'),
)
含義為hello/books/這個(gè)URI資源對(duì)應(yīng)的相應(yīng)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風(fēng)格的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})
最終頁面上的內(nèi)容,通過title和books兩個(gè)參數(shù)傳遞給tempate(books.html)處理。
修改settings.py:
TEMPLATE_DIRS?=?(
????'/opt/PROJECTS/Django/hello/templates/',
)
指定templates目錄位置,注意需要使用絕對(duì)路徑和'/',無論是Unix還是Windows系統(tǒng)。
我們手工造一些數(shù)據(jù)之后,就可以通過
http://localhost:8000/hello/books/訪問我們用Django實(shí)現(xiàn)的這個(gè)簡單頁面了。
6- What's next
通過上面的簡單介紹,相信哪怕是初次接觸Django的朋友,也能夠?qū)jango有一個(gè)初步的認(rèn)識(shí)。其實(shí)Django并不難學(xué),并且隨著學(xué)習(xí)的深入,你一定能發(fā)現(xiàn)更多的驚喜,不論是來自Django本身,還是Python及其龐大的第三方類庫。
如果有時(shí)間,建議嘗試一下Django的admin pages,即為我們的model提供自動(dòng)化、網(wǎng)頁化的增刪改查操作。啟用方法如下:
修改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:
# 為了成功運(yùn)行admin pages,需要首先執(zhí)行python manage.py syncdb admin以創(chuàng)建django_admin_log表。
# 如果前面跳過了創(chuàng)建管理員步驟,簡單的方法可以刪掉auth_user表,然后python manage.py syncdb重建。
按照我們urls.py的配置,admin pages可以通過
http://localhost:8000/hello/admin/訪問。Enjoy!