標題有沒有殺人,照著作一遍就知道囉。

在 Ruby on Rails 的官方網站上有 15 分鐘作出一個 weblog 的 screencast,的確 demo 了 RoR 開發的快速。不過萬萬不可太迷信只有 RoR 能這麼神速,根據最近擠出一點時間看 django 的東西後,我也想先來作個「10分鐘做出 blog 的挑戰」。(由於還不太會用製作 screen cast 的軟體,所以只能用文字介紹..)這篇文章只是描述一下建構過程,所以不會介紹 django 環境的安裝設定,請讀者見諒。
稍微簡介一下 django,它是一個基於 Python 語言的 Web 開發框架(framework)。
建立 project 及 app
在 django 的環境裡,一個 project 裡可以有很多個 application,如此一來同一個 project 下的 application 便能共用同一套環境設定。所以我們先在命令列下執行 django-admin.py 來建立一個 project:
先來改一下 demo/settings.py 的設定,裡面設定我們會用 sqlite3 來作資料庫的引擎,然後產生一個 demo.db 的檔案來當資料庫,再設定一些時區及 template 目錄等:
DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'demo.db' ... TIME_ZONE='Asia/Taipei' LANGUAGE_CODE='zh-tw' ... TEMPLATE_DIRS = ( ... '.', ) INSTALLED_APPS = ( 'django.contrib.admin', .. 'demo.blog', # 等一下就會產生 )
然後在 demo 目錄下建立一個 blog 的 app:
然後在 demo/blog/models.py 裡建立需要的 model(DB Table):
from django.db import models class Category(models.Model): name = models.CharField(max_length=32) def __unicode__(self): return self.name class Admin: pass class Article(models.Model): title = models.CharField(max_length=64) published_at = models.DateTimeField('date published') content = models.TextField() category = models.ForeignKey(Category) def __unicode__(self): return self.title class Admin: pass
然後可以看看 django 產生的 SQL DDL,確定的話就用 syncdb 來建立資料庫表格:
其中會要求你建立一個管理者帳號,這是為了之後進管理介面發表文章使用的帳號。完成這些動作之後,修改一下 demo/urls.py 的內容:
from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^blog/', include('demo.blog.urls')), (r'^admin/', include('django.contrib.admin.urls')), )
先在 demo/blog/ 下建立一個 urls.py 的檔案,然後在命令列下輸入 python manage.py runserver,再打開瀏覽器輸入網址 http://localhost:8000/admin/ 馬上就有一個後台介面可以使用了呀!
登入後你就可以直接建立 Category 及 Artical 的內容,這不就是一個現成的文章發表介面了嗎?一開始操作到現在不會超過5分鐘吧!
文章列表、單篇文章
可以發表文章之後,當然是要能夠瀏覽呀,所以我們馬上打開 demo/blog/urls.py 這個檔案,然後貼上下列的 code:
from django.conf.urls.defaults import * from demo.blog.models import Article info_dict = { 'queryset': Article.objects.all(), } urlpatterns = patterns('', (r'^$', 'django.views.generic.list_detail.object_list', info_dict), (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict), )
然後再分別建立 demo/blog/article_list.html 及 demo/blog/article_detail.html 這兩個檔案,分別表示文章列表及文章內容:
article_list.html:
{% if object_list %} {% for article in object_list %} <div class="article"> <div class="title"><a href="/blog/{{ article.id }}">{{ article.title }}</a></div> </div> {% endfor %} {% else %} <p>對不起沒有文章喔!</p> {% endif %}
article_detail.html:
<div class="article"> <div class="title">標題: {{ object.title }}</div> <div class="pub_date">{{ object.published_at }}</div> <div class="content">{{ object.content }}</div> <div class="category">發表於: {{ object.category.name }}</div> </div> <p><a href="/admin/blog/article/{{ object.id }}">修改</a></p> <p><a href="/blog">BACK</a></p>
這樣很快就弄出一個很像樣的 blog (只是不能留言 XD),網址在 http://localhost:8000/blog/。
很快吧!當然我忽略了美工,也沒有客製化一下後台,不過 Web 開發愈來愈可怕了….真怕這種開發框架愈來愈多,老板都覺得寫網頁沒什麼了呢!
值得一提的是,django 在 runserver 之後,都會把程式碼 compile 成 pyc 檔,看起來效率應該還不錯,也許要等我多玩熟一點才能做些實驗囉。








文章分類:
標籤: 

2007/11/23 2:33 am
def __unicode__(self):
這個是甚麼來的,十分奇怪的樣子,python 不是預設 unicode 的嗎?
說親和性和可讀性,還是 Ruby 比較好一點吧?
2007/11/23 8:29 am
@moming2k
這篇我純粹是想說明 Python + django 的快速,
要寫得有可讀性也不難,只是可能要多花 1 分鐘吧 XD
2007/11/23 9:04 am
[quote comment=""]@moming2k
這篇我純粹是想說明 Python + django 的快速,
要寫得有可讀性也不難,只是可能要多花 1 分鐘吧 XD[/quote]
fleaphp和thickphp一样可以在短 时间内做到上面的程度(php框架 )^^
2007/11/23 9:27 am
@tomphp
Cool! 其實我的確是想說明, 快速開發不是只有 RoR 才能辦到呀…
2007/11/23 9:34 am
__unicode__ / __str__
是用來以文字顯示呼叫物件,
例如原本呼叫
>>> a = object()
>>> a
為 a 定義一個 __unicode__ 屬性後,
以文字顯示物件時就可以顯示想顯示文字
>>> class a:
… def __unicode__(self):
… return “hello”
>>> a = a()
>>> a
>>> print a
hello
說到可讀性,公認還是 Python 比較好一點吧 Orz
2007/11/23 10:09 am
> 說到可讀性,公認還是 Python 比較好一點吧 Orz
這是真的!Python 比 Ruby 好讀一些啊! :)
2007/11/25 11:06 pm
投「Python 比 Ruby 好讀一些啊!」一票
2007/12/08 10:17 pm
我記得 .py 與 .pyc 在效率上,沒什麼差別的 :)
[quote post="815"]There is no performance difference once the .pyc file has been loaded, as the bytecode read from the .pyc file is exactly the same as the bytecode created by direct translation. The only difference is that loading code from a .pyc file is faster than parsing and translating a .py file, so the presence of precompiled .pyc files improves the start-up time of Python scripts. If desired, the Lib/compileall.py module can be used to create valid .pyc files for a given set of modules.
http://effbot.org/pyfaq/can-python-be-compiled-to-machine-code-c-or-some-other-language.htm
[/quote]
2007/12/08 11:21 pm
@Drake
受教了 m(_ _)m
2008/01/04 1:52 pm
[...] 的文件也不少,不過我第一份當然是先看 ericsk 最近寫的 用 Python + django 10分鐘內作出一個 blog,但是我照著這份文件做發現一直有問題,後來發現到:FreeBSD ports 的 [...]
2008/03/12 12:23 pm
[...] 用 Python + django 10分鐘內作出一個 blog at 國二學生認真打雜 (tags: DjagnoTutorial) [...]
2008/03/20 2:11 pm
[...] 经过东挑细选,选择了Django这个Framework。之所以选择它,还得回忆起上个月碰巧看到的一篇文章──用 Python + django 10分鐘內作出一個 blog [...]
2008/05/31 12:05 am
最近開始想學Django (因為Google App Engine的關係,之前都用TurboGears XD)
這篇文章很有用:)
2008/06/21 8:40 am
[...] 用 Python + django 10分鐘內作出一個 blog at 國二學生認真打雜 [...]
2008/08/10 3:10 am
請問如何在Python上安裝django?
可以告訴我嗎?謝謝^^
2008/08/10 11:27 am
@benny
django 的網站上就有教了喔 :)
2008/08/15 10:08 pm
非常謝謝你~你不說我還沒發現耶~~感恩~