用 Python + django 10分鐘內作出一個 blog

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

django

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:

django1

先來改一下 demo/settings.py 的設定,裡面設定我們會用 sqlite3 來作資料庫的引擎,然後產生一個 demo.db 的檔案來當資料庫,再設定一些時區及 template 目錄等:
[code lang="python"]
DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'demo.db'
...
TIME_ZONE='Asia/Taipei'
LANGUAGE_CODE='zh-tw'
...
TEMPLATE_DIRS = (
...
'.',
)

INSTALLED_APPS = (
'django.contrib.admin',
..
'demo.blog', # 等一下就會產生
)
[/code]

然後在 demo 目錄下建立一個 blog 的 app:

圖片 1

然後在 demo/blog/models.py 裡建立需要的 model(DB Table):

[code lang="python"]
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
[/code]

然後可以看看 django 產生的 SQL DDL,確定的話就用 syncdb 來建立資料庫表格:

django3
django4

其中會要求你建立一個管理者帳號,這是為了之後進管理介面發表文章使用的帳號。完成這些動作之後,修改一下 demo/urls.py 的內容:

[code lang="python"]
from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^blog/', include('demo.blog.urls')),
(r'^admin/', include('django.contrib.admin.urls')),
)
[/code]

先在 demo/blog/ 下建立一個 urls.py 的檔案,然後在命令列下輸入 python manage.py runserver,再打開瀏覽器輸入網址 http://localhost:8000/admin/ 馬上就有一個後台介面可以使用了呀!

django5
django6
發表文章的介面還蠻好用的呢

登入後你就可以直接建立 CategoryArtical 的內容,這不就是一個現成的文章發表介面了嗎?一開始操作到現在不會超過5分鐘吧!

文章列表、單篇文章

可以發表文章之後,當然是要能夠瀏覽呀,所以我們馬上打開 demo/blog/urls.py 這個檔案,然後貼上下列的 code:

[code lang="python"]
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'^(?Pd+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
)
[/code]

然後再分別建立 demo/blog/article_list.htmldemo/blog/article_detail.html 這兩個檔案,分別表示文章列表及文章內容:

article_list.html:
[code lang="python"]
{% if object_list %}
{% for article in object_list %}

{% endfor %}
{% else %}

對不起沒有文章喔!

{% endif %}
[/code]

article_detail.html:
[code lang="python"]

標題: {{ object.title }}
{{ object.published_at }}
{{ object.content }}
發表於: {{ object.category.name }}

修改

BACK

[/code]

這樣很快就弄出一個很像樣的 blog (只是不能留言 XD),網址在 http://localhost:8000/blog/

django7 django8

很快吧!當然我忽略了美工,也沒有客製化一下後台,不過 Web 開發愈來愈可怕了....真怕這種開發框架愈來愈多,老板都覺得寫網頁沒什麼了呢!

值得一提的是,django 在 runserver 之後,都會把程式碼 compile 成 pyc 檔,看起來效率應該還不錯,也許要等我多玩熟一點才能做些實驗囉。

  • def __unicode__(self):
    這個是甚麼來的,十分奇怪的樣子,python 不是預設 unicode 的嗎?
    說親和性和可讀性,還是 Ruby 比較好一點吧?

  • @moming2k
    這篇我純粹是想說明 Python + django 的快速,
    要寫得有可讀性也不難,只是可能要多花 1 分鐘吧 XD

  • tomphp

    [quote comment=””]@moming2k
    這篇我純粹是想說明 Python + django 的快速,
    要寫得有可讀性也不難,只是可能要多花 1 分鐘吧 XD[/quote]
    fleaphp和thickphp一样可以在短 时间内做到上面的程度(php框架 )^^

  • @tomphp
    Cool! 其實我的確是想說明, 快速開發不是只有 RoR 才能辦到呀…

  • gasolin

    __unicode__ / __str__
    是用來以文字顯示呼叫物件,
    例如原本呼叫
    >>> a = object()
    >>> a

    為 a 定義一個 __unicode__ 屬性後,
    以文字顯示物件時就可以顯示想顯示文字

    >>> class a:
    … def __unicode__(self):
    … return “hello”
    >>> a = a()
    >>> a

    >>> print a
    hello

    說到可讀性,公認還是 Python 比較好一點吧 Orz

  • > 說到可讀性,公認還是 Python 比較好一點吧 Orz

    這是真的!Python 比 Ruby 好讀一些啊! 🙂

  • 投「Python 比 Ruby 好讀一些啊!」一票

  • 我記得 .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]

  • @Drake
    受教了 m(_ _)m

  • Pingback: FreeBSD 上的 django at Gea-Suan Lin’s BLOG()

  • Pingback: links for 2008-03-12 | 甘先生blog()

  • Pingback: Let’s Django! | I'm TualatriX()

  • GDX

    最近開始想學Django (因為Google App Engine的關係,之前都用TurboGears XD)
    這篇文章很有用:)

  • Pingback: Diigo Diary 06/21/2008 « Benx Blog()

  • benny

    請問如何在Python上安裝django?
    可以告訴我嗎?謝謝^^

  • @benny
    django 的網站上就有教了喔 🙂

  • benny

    非常謝謝你~你不說我還沒發現耶~~感恩~

  • 现在作网站就是工具多

  • 上官同學您好,我們是台大FunLearn網站
    主要是在做國高中數理分享網站
    目前需要聘任一位python高手進行網站開發的工作
    若您有興趣
    歡迎盡快與我們聯絡
    謝謝!

    台大FunLearn執行長 高至豪
    0953172766

    台大FunLearn目前網站****************
    http://www.wretch.cc/blog/funlearn
    **********************************

  • 求才: Python網頁工程師(好手限1名)
    我們是新創的遊戲公司FriendsPlay, 專攻網頁遊戲, 目前在funP及Facebook推出 “哈黑社會” 遊戲,頗受好評.
    達8萬玩家及每天70萬page view, 為一個還在不斷成長的遊戲網站。同時也正在開發多項社群遊戲, 希望有喜歡遊戲, 挑戰網頁新技術的您, 一同加入!

    blog: http://blog.jmap.cc/2009/01/12-70page-view-4.html

    公司經營項目:
    Facebook/funP遊戲應用程式開發與經營
    創新網路技術研發與應用

    連絡人:
    eric AT jmap.cc

  • **(after running the project, the following errors found, can you tell me why??)
    Traceback (most recent call last):

    File “C:Python26libsite-packagesdjangocoreserversbasehttp.py”, line 278, in run
    self.result = application(self.environ, self.start_response)

    File “C:Python26libsite-packagesdjangocoreserversbasehttp.py”, line 635, in __call__
    return self.application(environ, start_response)

    File “C:Python26libsite-packagesdjangocorehandlerswsgi.py”, line 239, in __call__
    response = self.get_response(request)

    File “C:Python26libsite-packagesdjangocorehandlersbase.py”, line 67, in get_response
    response = middleware_method(request)

    File “C:Python26libsite-packagesdjangomiddlewarecommon.py”, line 57, in process_request
    _is_valid_path(“%s/” % request.path_info)):

    File “C:Python26libsite-packagesdjangomiddlewarecommon.py”, line 142, in _is_valid_path
    urlresolvers.resolve(path)

    File “C:Python26libsite-packagesdjangocoreurlresolvers.py”, line 246, in resolve
    return get_resolver(urlconf).resolve(path)

    File “C:Python26libsite-packagesdjangocoreurlresolvers.py”, line 181, in resolve
    sub_match = pattern.resolve(new_path)

    File “C:Python26libsite-packagesdjangocoreurlresolvers.py”, line 179, in resolve
    for pattern in self.urlconf_module.urlpatterns:

    File “C:Python26libsite-packagesdjangocoreurlresolvers.py”, line 198, in _get_urlconf_module
    self._urlconf_module = __import__(self.urlconf_name, {}, {}, [”])

    ImportError: No module named urls

  • ilay

    hi,你好,請問一下你的mod_python是怎麼裝的呢,我用macports裝的會讓apache2起不來

  • help

    ImportError at /admin/
    No module named urls

    請問這是哪裡出了問題呢?
    有沒有高手可以解惑

  • micmic3

    Django 1.1 改了不少啊……

  • Pingback: Django 第一课: 建立 Blog « 网络中心 社区()

  • John

    在Django 1.1 還需要有一個步驟.
    欲在管理介面要產生blog的models
    必須再建立一個blog/admin.py
    然後寫入適當的描述即可.

  • haha

    http://static.zooomr.com/images/3783749_809bed97cc.jpg
    这张图片开始的步骤我就看不懂了呢?是在数据库中建表吗?如果是,是不是图片有很长没写全啊。

    还有:
    “然後可以看看 django 產生的 SQL DDL”
    这个不明白咯,怎么看,我刚学python

  • haha

    上面的问题解决了,呵呵,把class Admin相关4行注释掉才ok的,可这样进到后台看不到Article和Blog的管理,我又把注释掉的恢复了,可时,就在恢复的这4行中出现了错误
    class Admin:
    ^
    SyntaxError: invalid syntax
    这个问题是为什么呢?谢谢

  • haha

    上面的问题解决了,新版django的注册方法不一样
    打开http://localhost:8000/blog/时
    会提示:
    AttibuteError at /blog/
    ‘module’ object has no attribute ‘urlpatterns’

  • defage

    “在Django 1.1 還需要有一個步驟.
    欲在管理介面要產生blog的models
    必須再建立一個blog/admin.py
    然後寫入適當的描述即可.”

    需要增加admin.py这个档案里面应该怎么写?我的admin后台没有blog管理的那一块。

  • Vector

    Well, 怎么让文章列表像blog那样,新发布的在前面呢?

  • Pingback: 小人物 » [转]技术站点()

  • Pingback: 我收藏的技术站点 | 探索---不思()

  • ching-sun ti

    我是入門學習 , 將此網頁儲存下來 , 並想 試作一下 , 非常感謝 !!