摘要:很多初學(xué)django的小伙伴都會(huì)了解到,django是個(gè)大而全的網(wǎng)絡(luò)框架,本身集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。要學(xué)這么多內(nèi)容,要學(xué)到猴年馬月啊???不過(guò)世界真是奇妙,現(xiàn)在咱們就在猴年馬月里!2016年是猴年,按農(nóng)歷計(jì)算,6月5日至7月3日是庚午月,正好是“猴年”里的“馬月”。那么問(wèn)題來(lái)了:你想不想在猴年馬月里學(xué)會(huì)django呢?下面我們嘗試一下,用15行代碼結(jié)合dj
很多初學(xué)django的小伙伴都會(huì)了解到,django是個(gè)大而全的網(wǎng)絡(luò)框架,本身集成了ORM、模型綁定、模板引擎、緩存、Session等諸多功能。要學(xué)這么多內(nèi)容,要學(xué)到猴年馬月?。??
不過(guò)世界真是奇妙,現(xiàn)在咱們就在猴年馬月里!2016年是猴年,按農(nóng)歷計(jì)算,6月5日至7月3日是庚午月,正好是“猴年”里的“馬月”。那么問(wèn)題來(lái)了:你想不想在猴年馬月里學(xué)會(huì)django呢?
下面我們嘗試一下,用15行代碼結(jié)合django寫個(gè)web程序,來(lái)一次django的清爽體驗(yàn)。
django復(fù)雜嗎
當(dāng)然,復(fù)雜的很呢?。?!如果你是跟著官方文檔自學(xué)過(guò),就會(huì)知道,那里有個(gè)初級(jí)項(xiàng)目是投票網(wǎng)站,分了6部分才講完。而且如果你是個(gè)完完全全網(wǎng)絡(luò)編程的初學(xué)者,估計(jì)過(guò)了第3篇才看出個(gè)這個(gè)項(xiàng)目的樣子。而且在學(xué)習(xí)中,還需要了解django最重要的幾方面內(nèi)容:
比如目錄結(jié)構(gòu):
運(yùn)行django-admin startproject sitename后,你會(huì)看見(jiàn)sitename文件夾里的四個(gè)文件:
__init__.py settings.py urls.py wsgi.py
再運(yùn)行python manage.py startapp app01后,還可以在app01這個(gè)app的目錄里看出來(lái)所謂的MTV架構(gòu)。
__init__.py admin.py models.py # M,定義各種數(shù)據(jù)類 templates # T,這是個(gè)目錄,放html模板的,當(dāng)然你可以建到項(xiàng)目路徑下 views.py # V,根據(jù)路由編寫的響應(yīng)各種請(qǐng)求的函數(shù) app.py ...
如果你用過(guò)pycharm,新建工程和app后的代碼結(jié)構(gòu)如圖所示,帥哥做的很好,直接用了。
當(dāng)然,這些只是個(gè)初級(jí)認(rèn)識(shí),后面還要學(xué)習(xí)urls處理各種路由,然后怎么定義數(shù)據(jù)庫(kù),怎么前后端傳數(shù)據(jù),手續(xù)很復(fù)雜啊!
但是,你看看人家flask,bottle,分分鐘就弄出個(gè)hello world??!立馬就知道大致的框架用法了,django是不是也能這么玩呢?
清爽版本
巧了,國(guó)外早有django愛(ài)好者嘗試過(guò)django的簡(jiǎn)單玩法,而且還專門寫了本書(shū)。今天就拋磚引玉,大家一起來(lái)玩玩!
talk is simple, show me the code!
# -*- coding:utf-8 -*- # a mini Django project import sys from django.conf import settings from django.conf.urls import url from django.http import HttpResponse from django.core.management import execute_from_command_line settings.configure( DEBUG = True, # 調(diào)試狀態(tài) SECRET_KEY = 'iamasecretkeyhahahaha', # 默認(rèn)的session需要的key,也為了CSRF ROOT_URLCONF = sys.modules[__name__], # url根目錄的配置 ) def home(request): return HttpResponse('a mini django website') # 主頁(yè) urlpatterns = [ url(r'^$', home), # 元組類型,默認(rèn)請(qǐng)求發(fā)送到home函數(shù) ] # 啟動(dòng)程序 if __name__ == "__main__": execute_from_command_line(sys.argv)
新建個(gè)文件,比如miniWeb.py,寫上這些代碼,然后在當(dāng)前目錄下,命令行運(yùn)行:
>python miniWeb.py runserver
看到這些說(shuō)明運(yùn)行成功!
System check identified no issues (0 silenced). June 13, 2016 - 12:23:51 Django version 1.9.7, using settings None Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
然后用瀏覽器打開(kāi)http://localhost:8000/, wow, look at that! a mini django website應(yīng)該已經(jīng)出現(xiàn)在你的瀏覽器里!
是不是太簡(jiǎn)單了? 哈哈! 要的就是這種清爽感覺(jué)!爽不爽?不算注釋的話,也就15行吧。
簡(jiǎn)單解釋一下:這些代碼其實(shí)就是把一個(gè)django標(biāo)配的settings,view,url,manage幾個(gè)文件進(jìn)行了簡(jiǎn)化與整合,目的在于用最小的代碼向你展示django的網(wǎng)頁(yè)響應(yīng)過(guò)程。 實(shí)際也就是把django中的請(qǐng)求生命周期放在一個(gè)文件中展示了(我們這里還沒(méi)有涉及到model部分)。
流程如下:
1.__name__這行在學(xué)習(xí)python的時(shí)候每天都會(huì)用到,就是一個(gè)入口函數(shù),在我們這里就是一個(gè)命令行的入口,通過(guò)命令行傳入runserver參數(shù),然后django內(nèi)部會(huì)自己處理;
2.然后我們打開(kāi)http://localhost:8000/,這時(shí)候訪問(wèn)的是網(wǎng)站的根目錄url,我們?cè)趗rlpatterns里面,為這個(gè)指明了要跳轉(zhuǎn)的函數(shù),也就是home;
3.在home函數(shù)中,會(huì)通過(guò)Http響應(yīng),將頁(yè)面內(nèi)容返回給網(wǎng)頁(yè)前端;
4.于是,我們看到了頁(yè)面內(nèi)容a mini django website.
升級(jí)點(diǎn)的清爽版本
只有一行文字啊,這網(wǎng)站太low了!咱們給他加點(diǎn)鹽,弄個(gè)html模板好不好?
還是直接看代碼,關(guān)鍵地方我加了注釋:
# -*- coding:utf-8 -*- # a mini Django project import os # 添加模板路徑使用 import sys # 保存當(dāng)前路徑 BASE_PATH= os.path.dirname(__file__) from django.conf import settings from django.conf.urls import url # from django.http import HttpResponse # 不需要了 from django.shortcuts import render # 渲染模板,讓html中顯示后臺(tái)自定義內(nèi)容 from django.core.management import execute_from_command_line settings.configure( DEBUG = True, # 調(diào)試狀態(tài) SECRET_KEY = 'iamasecretkeyhahahaha', # 默認(rèn)的session需要的key,也為了CSRF ROOT_URLCONF = sys.modules[__name__], # url根目錄的配置 TEMPLATE_DIRS = ( os.path.join(BASE_PATH, 'templates'), # 告訴django在當(dāng)前目錄下找templates文件夾,這里還是元組,記得逗號(hào)! ), # 這里記得有逗號(hào),因?yàn)閟etting的配置也是元組 INSTALLED_APPS = ( # 默認(rèn)的認(rèn)證和內(nèi)容的app,需要添加避免傳數(shù)據(jù)的錯(cuò)誤 'django.contrib.auth', 'django.contrib.contenttypes', ), ) def home(request): #return HttpResponse('a mini django website') # 主頁(yè) data = {'name': 'alex', 'age':18} # 通過(guò)模板語(yǔ)言傳到頁(yè)面的數(shù)據(jù) print data return render(request, 'index.html', {'data': data}) urlpatterns = [ url(r'^$', home, name='home'), # 元組類型,默認(rèn)請(qǐng)求發(fā)送到home函數(shù) ] # 啟動(dòng)程序 if __name__ == "__main__": execute_from_command_line(sys.argv)
比剛才多了些模板文件的內(nèi)容,這時(shí)候我們還需要在當(dāng)前目錄下新建一個(gè)文件夾,名字就是templates,然后在里面新建一個(gè)html文件,可以像我這個(gè)一樣
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>mini django</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> </head> <body> <h1>顯示一下data:</h1> {{ data }} <h2>分開(kāi)輸出:</h2> <li>name:{{data.name}}</li> <li>age:{{data.age}}</li> </body> </html>
注意里面用到了一點(diǎn)模板語(yǔ)言,用{{}}表示的,其實(shí)就是個(gè)上面render函數(shù)最后的參數(shù)替換而已。
也就是這句:
return render(request, 'index.html', {'data': data})
注意這里,為了和django默認(rèn)新建工程一致,我把當(dāng)前目錄名和py文件名字都改成一樣的了:miniDjango.
命令行運(yùn)行: >python miniDjango.py runserver
再次打開(kāi)瀏覽器,訪問(wèn):http://localhost:8000/, wow, look at that!
顯示一下data: {'age': 18, 'name': 'alex'} 分開(kāi)輸出: name:alex age:18
是不是高大上了很多!
甚至,我們可以直接用Bootstrap的http://v3.bootcss.com/examples/jumbotron/這個(gè)模板測(cè)試一下。
首先保存這個(gè)網(wǎng)頁(yè)的源碼為bt.html文件,放到templates文件夾。
然后添加url和view函數(shù): 如下所示:
def bt(request): data = {'title': 'alex', 'headings':['我是標(biāo)題1', '我是標(biāo)題2','我是標(biāo)題3']} # 通過(guò)模板語(yǔ)言傳到頁(yè)面的數(shù)據(jù) return render(request, 'bt.html', {'data': data}) urlpatterns = [ url(r'^$', home, name='home'), # 元組類型,默認(rèn)請(qǐng)求發(fā)送到home函數(shù) url(r'^bt/$', bt, name='bt'), # 元組類型,默認(rèn)請(qǐng)求發(fā)送到bt函數(shù) ]
然后訪問(wèn)http://localhost:8000/bt/就可以看見(jiàn)效果了! 如下圖所示:
繼續(xù)學(xué)習(xí)吧
如果說(shuō)學(xué)習(xí)django像做一桌大餐,上面咱們討論的這點(diǎn)內(nèi)容頂多是做了個(gè)番茄炒蛋。想要學(xué)習(xí)更多,還需要好好的多加練習(xí),多和一起學(xué)習(xí)的小伙伴討論,最好再有個(gè)名師指點(diǎn)。
人生苦短,我用Python,加油吧,小伙伴們!
今天django的清爽體驗(yàn)到這里就結(jié)束了。 歡迎留言一起討論交流!
參考
http://radar.oreilly.com/2014/04/simplifying-django.html
Lightweight Django [book]