高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

縮短重新產生文章的時間

搬到Octopress之後,用Markdown寫文章感覺還不錯,不過慢慢的發現,每次我要寫一篇文章,想要看看它的樣子的時候,都得重新產生一次文章。雖然藉助一些可以所見即所得或內建預覽功能的markdown editor(例如MouByword之類的),但畢竟layout看起來還是不太一樣。

我這種小咖的文章只有大概200篇左右,也許是我電腦等級比較差,每次重新產生文章大概都得等個半分鐘左右,我開始好奇有上千篇文章的人在重新產生一次要花多久時間了。

正想說開發Octopress的人這麼聰明,應該不可能沒想到要怎麼解決這個問題。原來Octopress有寫好了一個rake指令叫做rake isolate,例如這樣:

> rake isolate[some-post]

後面接的是某一篇markdown的檔名(不包含日期),這樣一來它會把所有的文章搬到source/_stash底下,只留下some-post這個markdown檔在source/_post,這樣不管你是用Pow或是rake preview在本機預覽你的文章,因為只會重新產生一篇文章,速度都會快得多。放在source/_stashs的檔案在重新產生的時候會暫時被忽略。

如果寫好了,準備要來發佈了,可以來一下rake integrate,它會把剛剛移過去source/_stash的檔案再度的搬回來source/_post,再次rake generate之後就可以deploy出去了。這樣一來,每次需要等比較久的時間就只有最後要發佈出去的那次了。不過我覺得這樣還是不太滿足,難道不能比對檔案是否有變動然後只對有變動的markdown檔案做regenerate就行了嗎? 看來似乎得去改寫jekyll才有辦法的樣子 :)

上面這些動作,不管是rake isolate或是rake integrate,如果不放心或是懶得打指令的話,也都可以自己手動的來移動這些檔案。

搬到Octopress了

image

我也換到OctoPress了!

跟流行嗎? 也算是啦,不過這種Markdown + Static Page的寫法我的確比較喜歡,特別是我寫的東西幾乎都會有一些程式碼,在原來的WordPress得花不少時間在處理程式碼範例變色的問題。

WP的plugin是很方便,但Octopress要寫plugin看起來也不是很難寫(我自己仿著內建的幾個plugin,就可以簡單的寫出給自己用的Vimeo跟Youtube的plugin了);反倒是我PHP的程度比較差,要在WP裡面改什麼東西對我來說實在難度太高了。

超便利的Github Page加上可以很簡單的自定domain name,於是我就花了一、二天的時間把文章手動的轉成markdown。還好我本來在WP就是用permalink,所以轉換過來別人還是連得到。

為什麼不用工具自動轉? 因為我想再從頭一篇一篇看自己寫的東西,而且其實也沒幾篇(算了一下才171篇)。用這個寫之後,感覺會不知不覺的就一直寫下去。

如果大家有興趣試看看的話,Heroku跟Github Page都是不錯的hosting空間,要在Heroku安裝的話可以參考這篇

Learn Python and Django from the Beginning

Python

  1. Python簡介
  2. 安裝Python
  3. 如果你是使用Windows作業系統的話..
  4. 邏輯及流程控制
  5. Method
  6. 數字
  7. Boolean
  8. 字串
  9. List
  10. Dictionary
  11. Tuple
  12. 例外處理
  13. 模組
  14. 物件導向程式設計

Django

  1. Django簡介
  2. 安裝Django
  3. 開始你的第一個專案
  4. 建立App
  5. Django Shell
  6. 更多關於Model的使用
  7. 在Django裡做Database Migration
  8. 資料表的關連
  9. 網址設定
  10. Template
  11. 從Model到Template
  12. Flatpage
  13. 小結

我另外在http://python-and-django.heroku.com/也放了一份。

這次是用Octopress + Markdown寫的,感覺相當順手,不知不覺就會一直打字下去。內容還沒很完整,我會再找時間把它繼續完成,希望內容對大家有幫助。

如果有寫錯的地方再請不吝告知,感謝!

小結

官網的文件一定要讀!!

如果你之後會把Django當做你主力的開發工具的話,目前坊間的書因為版本幾乎都沒跟上,所以大概可以先放旁邊,不過至少要把官網的資料讀過一遍。那如果文件看完怎麼辦? 閱讀原始碼啊!!

Django本身是open source的,而且是用純Python寫的,所以閱讀Django的原始碼,保證可以讓你的Python增加不少,而且當遇到一些文件上沒提到的問題的時候,通常也只有原始碼可以救你了。

養成閱讀文件及原始碼的習慣,可以讓你在這條路上走的更順利!

還有哪些主題沒講到的?

其實還滿多的,例如怎麼寄Email表單的處理資料驗證Admin模組的客製化等等,都是很常用而且很重要的主題。

這還沒有結束!!

如果時間許可,我會繼續把這個系列寫完的。

如果內容有哪邊寫錯了,還請歡迎來信跟我說 :)

Django的Flatpage

Django的功能很多,但假設其實你根本不需要這麼多資料庫相關的功能,你只是想做個簡單的個人簡介頁面,然後有個簡單的後台管理介面可以讓你更新內容就好,那你也許可以使用Django的Flatpage就行了。

使用方式很簡單,只要把一些module加上去就行了。請打開settings.py,在INSTALLED_APPS加上django.contrib.flatpages

1
2
3
4
5
6
7
8
9
10
11
12
13
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    'django.contrib.flatpages',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

並且在MIDDLEWARE_CLASSES加上django.contrib.flatpages.middleware.FlatpageFallbackMiddleware

1
2
3
4
5
6
7
8
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

然後,你可能需要改一下TEMPLATE_DIRS,設定一下template的路徑:

1
2
3
4
5
6
7
PROJECT_BASE_DIR = os.path.dirname(__file__).replace('\\', '/')
TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    PROJECT_BASE_DIR + '/templates',
)

PS: 感謝 Lazkey 提醒,TEMPLATE_DIRS 裡請使用絕對路徑。

urls.py記得把Admin模組相關的設定打開:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.conf.urls.defaults import patterns, include, url

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

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

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

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

再來執行一下syncdb:

> python manage.py syncdb

這樣就設定完成了。進到Admin介面,你應該可以看到多了一個"簡平頁面"的功能(如果你沒改語系的話,應該會看到Flatpage):

image

然後你就可以開始新增頁面了。不過在新增頁面的最下面有個Sites選項要特別注意,預設是www.example.com,這邊要把它換成我們自己的網址。以本機為例,加入了127.0.0.1:8000。又,因為這個site是我們後來新加的,所以要讓它生效的話,需要再回頭來改一下settings.pySITE_ID

1
  SITE_ID = 2

最後,你還需要做個template給它用:

Flatpage HTML (flatpage.html) download
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

把上面這些內容存在 templates/flatpages/default.html,重新整理之後,應該就可以看得到內容了。

更多詳細內容及使用方式,請見Django官網 - Flatpage章節