簡化 Django
來自: http://python.jobbole.com/84293/
盡管Django的流行和普及, 一些開發者仍然認為她是一個過時的web開發框架, 僅僅適合內容豐富的web程序。 然而現在大多數web程序往往不是富內容的, 這似乎讓Django看起來不是最佳選擇的web框架。
那么讓我們花點時間從現在的web開發實踐中重新認識下她吧。
簡單清晰的Django
一個web框架主要是幫助web程序生成核心的架構, 以便在其他的項目中重用。 Django正是以此為基礎, 快速構建web程序。 Django的核心主要是WSGI程序, 通過處理HTTP請求并返回有意義的HTTP應答。 她提供了各種工具, 像生成URL路由, cookie的處理, 解析表單數據和上傳文件。
還有, Django為HTTP應答創建了動態的模板引擎。你可以立馬使用, 為了豐富web程序構建體驗, 她提供了很多的各種各樣的過濾器和標簽, 去創建動態的可擴展模板。
通過這些工具, 你能輕松地在Django的項目中創建簡單清晰的微型框架。
我們知道有些人喜歡自己造輪子。 我們不是說貶低這種行為, 但是使用Django開發的話會讓我們有更少的干擾。 比如, 當你在糾結 Jinja2,, Mako, Genshi, Cheetah的時候, 你可能已經在使用Django已存在的模板引擎。 更少的糾結讓我們更多的享受愉快的開發過程。
培訓新的Django使用者
在Django和其他的web框架的社區中有一個很大的問題, 就是對新使用者的培訓問題。 就像有很多Django使用者是通過Django官網上的 創建一個投票程序 來學習Django的。 我們很多老道的Django開發者認為它是一個進入Django社區的“通過儀式”。 但是它是學習Django最好的方法嗎? 我覺得不是。
目前, 這個投票程序有六個部分。 雖然每個部分都有它的意義, 但是直到 第三個 你才能寫你的視圖和構造HTTP應答。 相比較簡單的“Hello World”程序在某些流行的python微型框架(像Flask和Bottle)的首頁而言, 這太遙遠了。 最好的學習方法是當我們學習Django的某一塊的時候沒有過多的阻礙, 并且能夠專注于處理請求和應答的交互上。 新使用者在構建常見的web任務的時候能從框架的其他部分中獲得幫助, 像回話管理, 用戶驗證和內置的admin接口。
那么, 按照我們的意思來構建一個簡化版的Django教程:
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse from django.core.management import execute_from_command_line settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse from django.core.management import execute_from_command_line settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
簡單吧。 這段簡短的代碼是運行Django項目所需要的全部。 讓我們開始逐步解釋下各部分代碼吧。
首先, 我們需要確保引入了HttpResponse, 并且返回我們希望返回的內容。
from django.http import HttpResponse def index(request): return HttpResponse('Powered by Django')
from django.http import HttpResponse def index(request): return HttpResponse('Powered by Django')
一般來說, 這段代碼應該在view.py里面。 不過在這個簡化版的教程中, 我們把Django項目中所有代碼放在一個單一的文件。
應用的當前部分與下一部分的完美紐帶是鏈接結構。上面的代碼就期望這樣的一個url索引,所以我們需要為它創建一個。
from django.conf.urls import patterns from django.http import HttpResponse def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), )
from django.conf.urls import patterns from django.http import HttpResponse def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), )
僅僅通過以上7行代碼我們就為應用程序構建好了在Django上運行的基礎!現在,讓我們完成一些基本設置,使應用程序可以執行起來。
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), )
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), )
你可能已經發現在上面的例子中,我們已經剝離了那些設置,并且尤其是省略了數據庫的配置。這些設置將可以作為一個針對新用戶進入的門檻,當這些新用戶試圖確定使用什么數據庫時,可能避免出現混亂的情況。當開發一個項目時,我們希望確保自己的工作專注于特定部分,從而降低工作中的阻礙。
注意:在settings.configure文件里設置隨機的 SECRET_KEY以便保護session and cross-site request forgery (CSRF).
由于沒有使用 start project命令生成該結構,我們會丟掉manage.pyfile文件.因此需要手工添加相關的manage.pyand信息:
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse from django.core.management import execute_from_command_line settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
import sys from django.conf import settings from django.conf.urls import patterns from django.http import HttpResponse from django.core.management import execute_from_command_line settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], ) def index(request): return HttpResponse('Powered by Django') urlpatterns = patterns('', (r'^$', index), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
現在可以從命令行啟動應用了:
$ python project_name.py runserver
$ python project_name.py runserver
訪問 127.0.0.1:8000, 會看到 “Powered by Django”頁面了!
看到這里, 你可能要問: “模型和視圖在哪呢?”。 在此之前讓我們先放松一下。 讓我們討論下Django到底是什么–她是一個包含一系列我們經常需要用到的工具的web框架, 并且你能很容易在項目中引用它們。 接下來我們將介紹如何引入這些工具。 構建一個模板就是個不錯的列子。 讓我們開始動手吧。
添加模板文件前我們要添加urls和一些必要設置, 要讓Django知道模板文件放在哪。 把這些設置添加到文件里吧。
import os import sys BASE_PATH = os.path.dirname(__file__) from django.conf import settings from django.conf.urls import patterns, url from django.core.management import execute_from_command_line from django.shortcuts import render settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], TEMPLATE_DIRS=( os.path.join(BASE_PATH, 'templates'), ), ) def index(request): return render(request, 'index.html', {'request': request}) urlpatterns = patterns('', url(r'^$', index, name='index'), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
import os import sys BASE_PATH = os.path.dirname(__file__) from django.conf import settings from django.conf.urls import patterns, url from django.core.management import execute_from_command_line from django.shortcuts import render settings.configure( DEBUG=True, SECRET_KEY='placerandomsecretkeyhere', ROOT_URLCONF=sys.modules[__name__], TEMPLATE_DIRS=( os.path.join(BASE_PATH, 'templates'), ), ) def index(request): return render(request, 'index.html', {'request': request}) urlpatterns = patterns('', url(r'^$', index, name='index'), ) if __name__ == "__main__": execute_from_command_line(sys.argv)
你會注意到在頂部我們增加了os.path Python模塊的導入。通過這樣做,我們已經為新用戶創建了一種容易的方式指向他們的項目文件夾。現在我們能在我們的TEMPLATE_DIRS設置中輕松的添加指向模板的路徑,并開始體驗Django的內置標簽和過濾器的優勢!
正如你可以看到,通過將創建一個Django應用程序的基礎部分分解成較小的部分,我們可以創建一個更簡單的方法給內建的新用戶。我們需要重新學習怎樣讓Django在沒有ORM和Django管理的時候創建Django應用程序。需要認識到Django的那些內置功能他們真是的是什么。在使用框架時他們不是必須的,如果你感覺他們不是必須的,你并沒有失去太多。我們開始使用Django好的部分而不是感覺它的重量,就像我們學習Python的標準庫。讓我們開始移去過時的東西,看看它的源碼,功能真的是很豐富。
因此,基于所有的這些,在輕量的模式中你正在考慮構建一些能夠開發什么的應用程序?
</div>