一步一步學(xué)Django.doc_第1頁(yè)
一步一步學(xué)Django.doc_第2頁(yè)
一步一步學(xué)Django.doc_第3頁(yè)
一步一步學(xué)Django.doc_第4頁(yè)
一步一步學(xué)Django.doc_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

學(xué)習(xí)資料收集于網(wǎng)絡(luò),僅供參考第一講 入門(mén)1 開(kāi)篇Django 是新近出來(lái)的 Rails 方式的 web 開(kāi)發(fā)框架。在接觸 Django 之前我接觸過(guò)其它幾種 Python 下的 web framework, 但感覺(jué) Karrigell 是最容易上手的。不過(guò) Django 從我個(gè)人的感覺(jué)上來(lái)看,它的功能更強(qiáng)大,社區(qū)也很活躍,高手眾多,發(fā)展也是極為迅速。3Django的入門(mén)體驗(yàn)但 Django 呢?如果說(shuō)最簡(jiǎn)單的web體驗(yàn) Hello, Django! 如何寫(xiě)呢?決不會(huì)象 Karrigell 那樣簡(jiǎn)單,只從它提供的教程來(lái)看,你無(wú)法在安裝后非常 Easy 地寫(xiě)出一個(gè) Hello, Django! 的例子,因?yàn)橛幸幌盗械陌惭b和準(zhǔn)備工作要做。那么下面我把我所嘗試寫(xiě)最簡(jiǎn)單的 Hello, Django! 的例子寫(xiě)出來(lái)。請(qǐng)注意,我測(cè)試時(shí)是在 Windows XP 環(huán)境下進(jìn)行的。3.1安裝python setup.py install參考文檔 Django installed,一般地,Django 安裝前還需要先安裝 setuptools 包。可以從 PyPI 上搜到。目前最新的版本是 0.95 版,可以從 Django 的主頁(yè)上面下載。如果你想從老的 0.91 遷移到最新版本,可以參閱 RemovingTheMagic 文檔。安裝后,建議檢查 pythoninstalldir/Scripts 目錄是否在你的 PATH 環(huán)境中,如果不在,建議將這個(gè)目錄設(shè)置到 PATH 中。因?yàn)槿绻悴捎脴?biāo)準(zhǔn)的 Python 安裝方法,那么 Django 會(huì)自動(dòng)在 Scripts 目錄下安裝 django-admin.py 程序。這樣,一旦你設(shè)置了 Scripts 在 PATH 中,就可以在命令行下任何目錄中執(zhí)行 django-admin.py 了。3.2生成項(xiàng)目目錄因?yàn)?Karrigell 可直接開(kāi)發(fā),因此放在哪里都可以。而 Django 是一個(gè)框架,它有特殊的配置要求,因此一般不需要手工創(chuàng)建目錄之類(lèi)的工作, Django 提供了 django-admin.py 可以做這件事。為使用 django-admin.py ,建議將 Python 的 Scripts 目錄加入到 PATH 環(huán)境變量中去。django-admin.py startproject newtest這樣就在當(dāng)前目錄下創(chuàng)建了一個(gè) newtest 目錄,進(jìn)去入可以看到有四個(gè)文件:這個(gè) newtest 將是我們以后工作的目錄,許多講解都是基于這個(gè)目錄的。_init_.py 表示這是一個(gè) Python 的包 manage.py 提供簡(jiǎn)單化的 django-admin.py 命令,特別是可以自動(dòng)進(jìn)行 DJANGO_SETTINGS_MODULES 和 PYTHONPATH 的處理,而沒(méi)有這個(gè)命令,處理上面環(huán)境變量是件麻煩的事情 settings.py 它是django的配置文件 uls.py url映射處理文件,Django的url映射是url對(duì)某個(gè)模塊方法的映射,目前不能自動(dòng)完成 在 0.91 版, django-admin.py startproject 會(huì)生成 apps 目錄。但 0.95 版之后已經(jīng)沒(méi)有了。雖然 django-admin.py 為我們生成了許多東西, 而且這些東西在以后的開(kāi)發(fā)中你都需要熟悉,但現(xiàn)在我們的目標(biāo)是最簡(jiǎn)單的體驗(yàn),就認(rèn)為我們不需要知道它們都有什么用吧。項(xiàng)目創(chuàng)建好了,那么我們可以啟動(dòng)服務(wù)器嗎? Django 為了開(kāi)發(fā)方便,自帶了一個(gè)用于開(kāi)發(fā)的 web server。在 0.91 版,你需要至少修改一下 settings.py 中的 DATABASE_ENGINE ,如果你不改,那么 Django 會(huì)報(bào)錯(cuò)。在0.95版之后,不再需要設(shè)置了。3.3.1啟動(dòng) web server:別急呀,還沒(méi)看見(jiàn) Hello, Django! 在哪里呢。是的,我只是想看一看, Django 能否啟動(dòng)。manage.py runserver一旦出現(xiàn):Validating models.0 errors found.Starting server on port 8000 with settings module newtest.settings.Go to :8000/ for Django.Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).說(shuō)明 Django 真的啟來(lái)了。在瀏覽器中看一下,有一個(gè)祝賀頁(yè)面,說(shuō)明成功了。3.3.2更改主機(jī)或端口 默認(rèn)情況下, runserver 命令在 8000 端口啟動(dòng)開(kāi)發(fā)服務(wù)器,且只監(jiān)聽(tīng)本機(jī)連接。要想要更改服務(wù)器端口的話,可將端口作為命令行參數(shù)傳入: python manage.py runserver 8080還可以改變服務(wù)器監(jiān)聽(tīng)的 IP 地址。要和其他開(kāi)發(fā)人員共享同一開(kāi)發(fā)站點(diǎn)的話,該功能特別有用。下面的命令: python manage.py runserver :8080會(huì)讓 Django 監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口,因此也就讓其它電腦可連接到開(kāi)發(fā)服務(wù)器了3.4增加一個(gè)helloworld的app嗎?在 Django 中絕大多數(shù)應(yīng)用都是以app形式存在的,但一定要加嗎?其實(shí)并不一定。在 Django 中,每個(gè)app就是一個(gè)子包,真正調(diào)用時(shí)需要通過(guò) URL Dispatch 來(lái)實(shí)現(xiàn)url與模塊方法的映射。這是 Django 的一大特色,但也是有些麻煩的地方。不用它,你無(wú)法發(fā)布一個(gè)功能,如果在 Django 中存在一種缺省的簡(jiǎn)單映射的方式,這樣我想可以大大提高 Django 的入門(mén)體驗(yàn)度。不過(guò)在比較大的項(xiàng)目中,使用 app 還是一個(gè)非常好的方式,它可將項(xiàng)目功能進(jìn)行分割,以便組織和代碼的重用。因此根據(jù) URL Dispatch 的機(jī)制,我們只要保證 Django 可以在正確的地方找到方法進(jìn)行調(diào)用即可。那么我們就根本不去創(chuàng)建一個(gè)app了。在 newtest 目錄下建一個(gè)文件 helloworld.py 內(nèi)容為:from django.http import HttpResponsedef index(request): return HttpResponse(Hello, Django.)0.95 版之后對(duì)許多 Django 模塊都做了簡(jiǎn)化。具體可參考: NamespaceSimplification 文檔。3.5修改urls.pyfrom django.conf.urls.defaults import *urlpatterns = patterns(, # Example: # (rnewtest/,include(newtest.apps.foo.urls.foo), (r$, newtest.helloworld.index), # Uncomment this for admin:#(radmin/, include(django.contrib.admin.urls),)上面的 r$ 是為了匹配空串,也就是形如: http:/localhost:8000/ 。如果這時(shí) web server 已經(jīng)啟動(dòng)了,那么直接刷新頁(yè)面就行了。現(xiàn)在覺(jué)得 Django 是不是簡(jiǎn)單多了,除了創(chuàng)建一個(gè)項(xiàng)目的操作,然后可能要修改兩個(gè)配置文件。4結(jié)論Django 本身的確是一種松散的框架組合,它既復(fù)雜又簡(jiǎn)單。復(fù)雜是因?yàn)槿绻阆胧褂盟淖詣?dòng)化的、高級(jí)的功能你需要學(xué)習(xí)很多的東西,而且它的教程一上來(lái)就是以這種過(guò)于完整的例子進(jìn)行展示,自然會(huì)讓你覺(jué)得很麻煩。不過(guò)看了我的講解之后,是不是覺(jué)得還是挺簡(jiǎn)單的。那么我們就先以無(wú)數(shù)據(jù)庫(kù)的方式進(jìn)行下去,一點(diǎn)點(diǎn)地發(fā)掘 Django 的功能特性吧。第二講 生成一個(gè)web form 做加法的簡(jiǎn)單例子1引言隨著學(xué)習(xí),我們的例子也開(kāi)始復(fù)雜了,下一步我想實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 加法器。界面會(huì)是這樣:如何處理頁(yè)面表格提交的數(shù)據(jù),并且會(huì)對(duì) URL Dispatch 作更進(jìn)一步的解釋。2創(chuàng)建 add.py 文件我們先創(chuàng)建一個(gè) add.py 文件。(由于我們還沒(méi)有涉及到 Django 的模型,因此象 add.py 這樣的東西叫什么呢?還是稱其為 View 吧。因?yàn)樵?django 中,View 是用來(lái)顯示的,它代替了一般的 MVC 中的 Control 的作用,因?yàn)?Django 中不是 MVC 而是 MTV (Model Template View)from django.http import HttpResponsetext = + def index(request): if request.POST.has_key(a): a = int(request.POSTa) b = int(request.POSTb) else: a = 0 b = 0 return HttpResponse(text % (a, b, a + b)請(qǐng)注意 action 為 /add/ ,在 Django 中鏈接后面一般都要有 / ,不然有可能得不到 POST 數(shù)據(jù)。有關(guān)更詳細(xì)的關(guān)于常見(jiàn)問(wèn)題可以參閱 NewbieMistakes 文檔。這里只有一個(gè) index 方法。所有在 view 中的方法第一個(gè)參數(shù)都會(huì)由 Django 傳入 request 對(duì)象,它就是請(qǐng)求數(shù)據(jù)對(duì)象,它是由 Django 自動(dòng)生成。其中有 GET 和 POST 屬性,分別保存兩種不同的提交方式的數(shù)據(jù),它們都可以象字典一樣工作。更多關(guān)于 request 的內(nèi)容參見(jiàn) Request and response objects 文檔。那么我的想法就是:進(jìn)入頁(yè)面后(就是上面的效果),頁(yè)面上有兩個(gè)輸入文本框,一個(gè)是提交按鈕,一個(gè)是顯示結(jié)果的文本框。在兩個(gè)輸入文本框中輸入整數(shù),然后點(diǎn)擊提交(=號(hào)按鈕),將返回相同的頁(yè)面,但結(jié)果文本框中將顯示兩數(shù)相加的和。兩個(gè)輸入文本框分別定義為 a 和 b 。這里的邏輯就是:先判斷 POST 數(shù)據(jù)中是否有變量 a ,如果沒(méi)有則表示是第一次進(jìn)入,則 a, b 初始為 0 ,然后返回頁(yè)面。如果有變量 a ,則計(jì)算結(jié)果,返回頁(yè)面。3修改urls.py,增加 add 的 url 映射。from django.conf.urls.defaults import *urlpatterns = patterns(, # Example: # (rtestit/, include(newtest.apps.foo.urls.foo), (r$, newtest.helloworld.index), (radd/$, newtest.add.index), # Uncomment this for admin:# (radmin/, include(django.contrib.admin.urls),)4 啟動(dòng) server5 在瀏覽器測(cè)試:http:/localhost:8000/add,你會(huì)看到和我相似的界面,然后輸入整數(shù)試一試。6補(bǔ)充說(shuō)明1. 在 form 中的 method=post 。你當(dāng)然可以使用 get ,但是在 Django 的設(shè)計(jì)風(fēng)格中認(rèn)為,使用 POST 表示要對(duì)數(shù)據(jù)進(jìn)行修改,使用 GET 則只是獲取。2. Django 提供了 URL Dispatch 文檔,專(zhuān)門(mén)講解有關(guān) url 映射的東西。其中有一部分是關(guān)于 url 的正則表達(dá)式解析的。原本我認(rèn)為象 Karrigell 中一樣,定義在 form 中的變量會(huì)自動(dòng)映射為方法的參數(shù),但是我錯(cuò)了。方法中的參數(shù)是從 url 中通過(guò)正則表達(dá)式解析出來(lái)的,或者是在 url_conf(即 urls.py 文件)中指定的。因此它與 Karrigell 一點(diǎn)也不一樣。因此,如果你想從 POST 或 GET 數(shù)據(jù)中得到值,那么象我一樣去做好了。使用 request.POST 或 request.GET 或還有一個(gè)可以“統(tǒng)吃”的方法 request.REQUEST ,它們是一個(gè)字典數(shù)據(jù),使用起來(lái)也算方便。 從這里我更想了解方法中參數(shù)的使用,當(dāng)然這個(gè)例子并沒(méi)有,有機(jī)會(huì)再使用吧。關(guān)于正則表達(dá)式解析參數(shù)在 blog 和 rss 中用得是非常多的。第三講 使用Template的簡(jiǎn)單例子1引言從上一例我們看到,表格的生成是直接在 index() 函數(shù)中返回的 HTML 代碼,這種混合方式對(duì)于大型開(kāi)發(fā)非常不好,下面我們就學(xué)習(xí)模板的使用。 Django 自帶有模板系統(tǒng),但你可以不使用它,只要在 return 前使用自已喜歡的模板系統(tǒng)進(jìn)行處理,然后返回即可。但 Django 自帶的模板系統(tǒng)有很多特點(diǎn),我不做過(guò)多的說(shuō)明。我只是想使用它?,F(xiàn)在我的問(wèn)題就是:我有一個(gè)通訊錄數(shù)據(jù),我想使用一個(gè)表格來(lái)顯示。為了方便,我們不需要使用數(shù)據(jù)庫(kù),因此我把它存在 view 文件中。2創(chuàng)建 list.py#coding=utf-8from django.shortcuts import render_to_responseaddress = name:張三, address:地址一, name:李四, address:地址二 def index(request): return render_to_response(list.html, address: address)我使用了漢字,并且字符的編碼使用了 utf-8 ,請(qǐng)注意,而且以后如果不特別注明,所有的帶漢字的文件,包括模板都將使用 utf-8 編碼。這里使用了一個(gè)新方法是 render_to_response ,它可以直接調(diào)用模板并返回生成好的文本。它接收兩個(gè)參數(shù),第一個(gè)是模板的文件名。在 Django 0.91 中,模板文件都是以 .html 結(jié)尾的,并且使用時(shí)是不帶后綴的。但 0.95 版本取消了缺省模板后綴的設(shè)置,因此模板文件名必須是完整的,不再有默認(rèn)后綴了。第二個(gè)參數(shù)是一個(gè)字典,這里只有一個(gè) Key ,名字是 address ,它的值是一個(gè)字典的列表。只要注意模板所接收的就是這樣的字典和包含字典的列表就行了。在0.91中 render_to_response 是在 django.core.extensions 中的,而到了 0.92 轉(zhuǎn)變?yōu)?django.shortcuts 。3在 newtest 中創(chuàng)建 templates 目錄:用來(lái)存放模板文件4修改 settings.pyTEMPLATE_DIRS = ( # Put strings here, like /home/html/django_templates. # Always use forward slashes, even on Windows. ./templates,)如果有多個(gè)模板目錄,加進(jìn)去就行了。 Django 會(huì)按順序搜索的。Django 還支持在 App 中定義一個(gè) templates 目錄。這樣 Django 在啟動(dòng)時(shí)會(huì)檢查所有安裝的的 App 的 templates 目錄,如果存在,則將路徑的搜索放在 TEMPLATE_DIRS 之后。這樣就可以很方便地管理你的模板了。5創(chuàng)建 templates/list.html通訊錄 姓名地址 % for user in address % user.address % endfor %生成了一個(gè)兩列的表格。在 Django 模板中 表示引用一個(gè)變量, % 表示代碼調(diào)用。在變量引用中, Django 還支持對(duì)變量屬性的訪問(wèn),同時(shí)它還有一定的策略,詳細(xì)的建議查看 The Django template language 文檔。這里我也使用了漢字,因此它也需要使用 utf-8 編碼。這里使用 for . in 的模板 Tag 處理。因此 address 需要是一個(gè)集合。在我們的 View 代碼中, address 為一個(gè) list 值。每個(gè) list 又是一個(gè)字典。因此 和 user.address 就是將此字典中的元素取出來(lái)。后面我們將了解更多的模板中的 Tag 標(biāo)簽的使用。且你會(huì)發(fā)現(xiàn), Django 中的 Tag 很強(qiáng)大,可通過(guò)擴(kuò)展形成龐大的 Tag 庫(kù)方便模板的開(kāi)發(fā)。6修改 urls.py增加了 list 的 url 映射。from django.conf.urls.defaults import *urlpatterns = patterns(, # Example: # (rtestit/, include(newtest.apps.foo.urls.foo), (r$, newtest.helloworld.index), (radd/$, newtest.add.index), (rlist/$, newtest.list.index), # Uncomment this for admin:# (radmin/, include(django.contrib.admin.urls),)7啟動(dòng) server::8000/list,效果如這樣:第四講 生成csv格式文件并下載1引言經(jīng)過(guò)前幾節(jié)的學(xué)習(xí),我想大家應(yīng)該比較熟悉 Django 的大致開(kāi)發(fā)流程了: 增加 view 方法 增加模板 修改 urls.py 剩下的就是挖掘 Django 提供的其它的能力。在我們還沒(méi)有進(jìn)入模型(model)之前還是再看一看外圍的東西,再更進(jìn)一步體驗(yàn) Django 吧。在 Django 中我看到了一個(gè)生成 csv 格式的文檔(Outputting CSV dynamically),非常好,它沒(méi)有數(shù)據(jù)庫(kù),正好用來(lái)做演示?,F(xiàn)在我的需求就是提供 csv 格式文件的下載。我們會(huì)在原來(lái) list(表格) 例子基礎(chǔ)上進(jìn)行演示,步驟就是上面的流程。2修改 templates/list.html在文件最后增加:csv格式下載它將顯示為一個(gè)鏈接,它所指向的鏈接將用來(lái)生成 csv 文件。3在newtest下增加 csv_test.py#coding=utf-8from django.http import HttpResponsefrom django.template import loader, Contextaddress = (張三, 地址一), (李四, 地址二) def output(request, filename): response = HttpResponse(mimetype=text/csv) responseContent-Disposition = attachment; filename=%s.csv % filename t = loader.get_template(csv.html) c = Context(data: address,) response.write(t.render(c) return responseloader, Context 是從 django.core.template 導(dǎo)入的,而 0.95 為 django.template 。具體可以參考: NamespaceSimplification 文檔。以后類(lèi)似的地方不再詳述。這里使用的東西多了一些。這里沒(méi)有 render_to_response 了,而是演示了一個(gè)完整的從頭進(jìn)行模板解析的處理過(guò)程。為什么需要這樣,因?yàn)槲覀冃枰薷?response 對(duì)象的值,而 render_to_response 封裝了它使得我們無(wú)法修改。從這里我們也可以看到,在調(diào)用一個(gè)方法時(shí), Django 會(huì)傳入一個(gè) request 對(duì)象,在返回時(shí),你需要將內(nèi)容寫(xiě)入 response ,必要時(shí)修改它的某些屬性。更詳細(xì)的建議你參考 django 所帶的 request_response 文檔,里面詳細(xì)描述了兩個(gè)對(duì)象的內(nèi)容,并且還可以在交互環(huán)境下進(jìn)行測(cè)試,學(xué)習(xí)非常方便。response 對(duì)象也是由 Django 自動(dòng)維護(hù)的。具體的內(nèi)容參見(jiàn) Request and response objects 文檔。這里 address 不再是字典的列表,而是 tuple 的列表。讓人高興的是, Django 的模板除了可以處理字典,還可以處理序列,而且可以處理序列中的元素。一會(huì)在模板定義中我們會(huì)看到。這里output() 是我們希望 Django 調(diào)用的方法,不再是 index() 了。而且它與前面的 index() 不同,它帶了一個(gè)參數(shù)。這里主要是想演示 url 的參數(shù)解析。因此你要注意,這個(gè)參數(shù)一定是放在 url 上的。它表示輸出文件名。response = HttpResponse(mimetype=text/csv)responseContent-Disposition = attachment; filename=%s.csv % filename這兩行是用來(lái)處理輸出類(lèi)型和附件的。它表明返回的是一個(gè) csv 格式的文件。t = loader.get_template(csv.html)c = Context(data: address,)response.write(t.render(c)這幾行就是最原始的模板使用方法。先通過(guò) loader 來(lái)找到需要的模板,然后生成一個(gè) template 對(duì)象,再生成一個(gè) Context 對(duì)象,它就是一個(gè)字典集。然后 t.render(c) 這個(gè)用來(lái)對(duì)模板和提供的變量進(jìn)行合并處理,生成最終的結(jié)果。最后調(diào)用 response.write() 將內(nèi)容寫(xiě)入。4增加 templates/csv.html% for row in data % row.0|addslashes, row.1|addslashes,% endfor %使用了一個(gè) for 循環(huán)。這里 data 與上面的 Context 的 data 相對(duì)應(yīng)。因?yàn)?data 是一個(gè)列表,它的每行是一個(gè) tuple ,因此 row.0, row.1 就是取 tuple 的第一個(gè)和第二個(gè)元素。 | 是一個(gè)過(guò)濾符,它表示將前一個(gè)的處理結(jié)果作為輸入傳入下一個(gè)處理。因此 Django 的模板很強(qiáng)大,使用起來(lái)也非常直觀和方便。 addslashes 是 Django 模板內(nèi)置的過(guò)濾 Tag ,它用來(lái)將結(jié)果中的特殊字符加上反斜線。同時(shí)我們注意到,每個(gè) 前后都有一個(gè)雙引號(hào),這樣就保證每個(gè)字符串使用雙引號(hào)引起來(lái)。然后在第一個(gè)與第二個(gè)元素之間還使用了逗號(hào)分隔。最后 endfor 在下一行,表示上面每行模板后有一個(gè)回車(chē)。Django 還允許你自定義 Tag ,在 The Django template language: For Python programmers 文檔中有描述。5修改 urls.pyfrom django.conf.urls.defaults import *urlpatterns = patterns(, # Example: # (rtestit/, include(newtest.apps.foo.urls.foo), (r$, newtest.helloworld.index), (radd/$, newtest.add.index), (rlist/$, newtest.list.index), (rcsv/(?Pw+)/$, newtest.csv_test.output), # Uncomment this for admin:# (radmin/, include(django.contrib.admin.urls),)增加了 csv 的 url 映射。上面的正則表達(dá)式有些復(fù)雜了,因?yàn)橛袇?shù)的處理在里面。 (?Pw+) 這是一個(gè)將解析結(jié)果起名為 filename 的正則表達(dá)式,它完全符合 Python 正則表達(dá)式的用法。在最新的 Django 中,還可以簡(jiǎn)化一下: (w+) 。但這樣需要你的參數(shù)是按順序傳入的,在一個(gè)方法有多個(gè)參數(shù)時(shí)一定要注意順序。關(guān)于 url 的配置問(wèn)題在 URL configuration 文檔中有說(shuō)明。還記得嗎?我們的鏈接是寫(xiě)成 /csv/address/ ,因此上面實(shí)際上會(huì)變成對(duì) csv.output(filename=address) 的調(diào)用。6啟動(dòng) server:看一下結(jié)果吧。點(diǎn)擊鏈接,瀏覽器會(huì)提示你保存文件的。很簡(jiǎn)單吧。但這里面的內(nèi)容其實(shí)也不少,而且許多地方都有很大的擴(kuò)展空間。第五講 session和數(shù)據(jù)庫(kù)1引言現(xiàn)在我們就學(xué)習(xí)一下 session 吧。 session 可以翻譯為“會(huì)話”,做過(guò)web的可能都知道。它就是為了實(shí)現(xiàn)頁(yè)面間的數(shù)據(jù)交換而產(chǎn)生的東西,一般有一個(gè) session_id ,它會(huì)保存在瀏覽器的 cookie 中,因此如果你的瀏覽器禁止了 cookie ,下面的試驗(yàn)是做不了的。在 Django 中的 session 也非常簡(jiǎn)單,它就存在于 request 對(duì)象的 session 屬性中。你可以把它看成一個(gè)字典就可以了。下面我們做一個(gè)非常簡(jiǎn)單的功能:首先當(dāng)用戶進(jìn)入某個(gè)頁(yè)面,這個(gè)頁(yè)面會(huì)顯示一個(gè)登錄頁(yè)面,上面有一個(gè)文本框用來(lái)輸入用戶名,還有一個(gè)提交按鈕用來(lái)提交數(shù)據(jù)。當(dāng)用戶輸入用戶名,然后點(diǎn)提交,則顯示用戶已經(jīng)登錄,并且打印出用戶的姓名來(lái),同時(shí)還提供一個(gè)“注銷(xiāo)”按鈕。然后如果用戶再次進(jìn)入這個(gè)頁(yè)面,則顯示同登錄成功后的頁(yè)面。如果點(diǎn)擊注銷(xiāo)則重新進(jìn)入未登錄的頁(yè)面。2在newtest下創(chuàng)建 login.pyfrom django.http import HttpResponseRedirectfrom django.shortcuts import render_to_responsedef login(request): username = request.POST.get(username, None) if username: request.sessionusername = username username = request.session.get(username, None) if username: return render_to_response(login.html, username:username) else: return render_to_response(login.html)def logout(request): try: del request.sessionusername except KeyError: pass return HttpResponseRedirect(/login/)兩個(gè)方法: login() 和 logout()。login() 用來(lái)提供初始頁(yè)面、處理提供數(shù)據(jù)和判斷用戶是否登錄。而 logout() 只是用來(lái)從 session 中刪除用戶名,同時(shí)將頁(yè)面重定向到 login 畫(huà)面。這里我仍然使用了模板,并且根據(jù)傳入不同的字典來(lái)控制模板的生成。是的,因?yàn)?Django 的模塊支持條件判斷,所以可以做到。在 login() 中的判斷邏輯是:A. 先從 POST 中取 username (這樣 username 需要由模板的 form 來(lái)提供),如果存在則加入到 session 中去。加入 session 很簡(jiǎn)單,就是一個(gè)字典的 Key 賦值。 B. 然后再?gòu)?session 中取 username ,有兩種可能:一種是上一步實(shí)現(xiàn)的。還有一種可能是直接從以前的 session 中取出來(lái)的,它不是新產(chǎn)生的。而這里并沒(méi)有細(xì)分這兩種情況。因此這個(gè)判斷其實(shí)對(duì)應(yīng)兩種頁(yè)面請(qǐng)求的處理:一種是提交了用戶姓名,而另一種則是處理完用戶提交姓名之后,用戶再次進(jìn)入的情況。而用戶再次進(jìn)入時(shí),由于我們?cè)谇懊嬉呀?jīng)將他的名字保存在 session 里面了,因此可以直接取出來(lái)。如果 session 中存在,則表示用戶已經(jīng)登錄過(guò),則輸出 login.html 模板,同時(shí)傳入了 username 字典值。而如果 session 中不存在,說(shuō)明用戶從來(lái)沒(méi)有登錄過(guò),則輸出 login.html 模板,這次不帶值。 因此對(duì)于同一個(gè) login.html 模板傳入的不同值,后面我們會(huì)看到模板是如何區(qū)分的。在 logout() 中很簡(jiǎn)單。先試著刪除 session ,然后重定向頁(yè)面到 login 頁(yè)面。這里使用了 HttpResponseRedirect 方法,它是從以前我們看到的 HttpResponse 派生來(lái)的子類(lèi)。更多的派生子類(lèi)和關(guān)于 response 的內(nèi)容要參考 Request and response objects 文檔。3創(chuàng)建 templates/login.html% if not username % 用戶名: % else %你已經(jīng)登錄了! username % endif %整個(gè)是一個(gè) if 語(yǔ)句。在 Django 模板中的 if 可以象 Python 一樣使用,如使用 not , and , or 。象 if not username 表示什么呢?它表示如果 username 不存在,或?yàn)榭?,或是假值等等。而此時(shí)我們利用了 username 不存在這種判斷。上面的邏輯表示,如果 username 不存在,則顯示一個(gè)表單,顯示用戶名輸入文本框。如果存在,則顯示已經(jīng)登錄信息,同時(shí)顯示用戶名和注銷(xiāo)按鈕。而這個(gè)注銷(xiāo)銨鈕對(duì)應(yīng)于 logout() 方法。4修改 urls.py:增加了 login 和 logout 兩個(gè)url映射。from django.conf.urls.defaults import *urlpatterns = patterns(, # Example: # (rtestit/, include(newtest.apps.foo.urls.foo), (r$, newtest.helloworld.index), (radd/$, newtest.add.index), (rlist/$, newtest.list.index), (rcsv/(?Pw+)/$, newtest.csv_test.output), (rlogin/$, newtest.login.login), (rlogout/$, newtest.login.logout), # Uncomment this for admin:#(radmin/, include(django.contrib.admin.urls),)5啟動(dòng) server 運(yùn)行但我要說(shuō),你一定會(huì)報(bào)錯(cuò)。而且我的也在報(bào)錯(cuò)。從這一刻起,我們就要進(jìn)入有數(shù)據(jù)庫(kù)的環(huán)境了。因?yàn)樵?django 中 session 是存放在數(shù)據(jù)庫(kù)中的。所以在這里要進(jìn)行數(shù)據(jù)庫(kù)的初始化了。6修改 settings.py,主要修改以下地方:DATABASE_ENGINE = sqlite3DATABASE_NAME = ./data.dbDATABASE_USER = DATABASE_PASSWORD = DATABASE_HOST = DATABASE_PORT = 這里我使用 sqlite3 。在使用數(shù)據(jù)庫(kù)時(shí),需要安裝相應(yīng)的數(shù)據(jù)庫(kù)處理模塊。對(duì) sqlite3 只需要修改兩項(xiàng): DATABASE_ENGINE 和 DATABASE_NAME 。這里數(shù)據(jù)文件名我使用了相對(duì)路徑,在實(shí)際情況下可能使用絕對(duì)路徑為好。sqlite3 對(duì)應(yīng)的是 pysqlite2 模塊,從 / 下載到最新版本。如果你使用utf-8,要注意缺省字符編碼應(yīng)為utf-8。同時(shí)對(duì)于 DATABASE_PORT 字段,Django 目前允許使用數(shù)字或字符串表示了。7初始化數(shù)據(jù)庫(kù):改了配置還不夠,還要執(zhí)行相應(yīng)的建庫(kù)、建表的操作,使用 django-admin.py 或 manage.py 都可以:manage.py syncdb它可以自動(dòng)創(chuàng)建已經(jīng)安裝的 App 中,在數(shù)據(jù)庫(kù)中不存在的 Model。并且會(huì)自動(dòng)將表的權(quán)限賦與超級(jí)用戶。并且把超級(jí)用戶的創(chuàng)建也結(jié)合到了一起。8啟動(dòng) server,這次再進(jìn)入試吧:http:/localhost:8000/login/,從此我們要進(jìn)入數(shù)據(jù)庫(kù)的世界了,當(dāng)然目前還沒(méi)有用到,而 Django 提供的許多自動(dòng)化的高級(jí)功能都是需要數(shù)據(jù)庫(kù)支持的。第六講 wiki的例子1引言以后的例子可能會(huì)越來(lái)越復(fù)雜,下面我們按照 TurboGears 的 20 Minute Wiki Tutorial 的例子仿照一個(gè),我們要用 Django 來(lái)做 wiki。我不會(huì)按 TurboGears 的操作去做,只是實(shí)現(xiàn)一個(gè)我認(rèn)為的最簡(jiǎn)單的 wiki。現(xiàn)在我的要求是:做一個(gè)簡(jiǎn)單的wiki,要可以修改當(dāng)前頁(yè)面,即在頁(yè)面下面提供一個(gè)編輯的按鈕。然后還要識(shí)別頁(yè)面中的兩個(gè)開(kāi)頭大寫(xiě)的單詞為頁(yè)面切換點(diǎn),可以進(jìn)入一個(gè)已經(jīng)生成好的頁(yè)面,或提示創(chuàng)建一個(gè)新頁(yè)面。下面我們將開(kāi)始創(chuàng)建 Django 中的 app 了。先說(shuō)一下。如果你看過(guò)官方版的教程,它就是講述了一個(gè) Poll 的 app 的生成過(guò)程。那么一個(gè) app 就是一個(gè)功能的集合,它有自已的 model ,view 和相應(yīng)的模板,還可以帶自已的 urls.py 。那么它也是一個(gè)獨(dú)立的目錄,這樣一個(gè) app 就可以獨(dú)立地進(jìn)行安裝,你可以把它安裝到其它的 Django 服務(wù)器中去。因此采用 app 的組織形式非常有意義。而且 adango-admin.py 也提供了一個(gè)針對(duì) app 的命令,一會(huì)我們就會(huì)看到。而且 Django 提供一些自動(dòng)功能也完全是針對(duì)于 app 這種結(jié)構(gòu)的。Model, Template, View 就合成了 MTV 這幾個(gè)字母。 Model 是用來(lái)針對(duì)數(shù)據(jù)庫(kù),同時(shí)它可以用來(lái)自動(dòng)生成管理界面, View 在前面我們一直都用它,用來(lái)處理請(qǐng)求和響應(yīng)的相當(dāng)于MVC框架中的 Controller 的作用, Template 用來(lái)生成界面。2創(chuàng)建 wiki appmanage.py startapp wiki在 0.91 版, app 都是放在 apps 目錄下的。不過(guò)到了 0.95 版,apps 目錄不自動(dòng)創(chuàng)建了。因此你就可以直接放在項(xiàng)目目錄下了。這樣在 wiki 子目錄下有以下文件:_init_.py 表示 wiki 目錄是一個(gè)包。 views.py 用來(lái)放它的 view 的代碼。 models.py 用來(lái)放 model 代碼。 3編輯 wiki/models.pyfrom django.db import models# Create your models here.class Wiki(models.Model): pagename = models.CharField(max_length=20, unique=True) content = models.TextField()每個(gè) model 其實(shí)在 Django 中就是一個(gè)表,你將用它來(lái)保存數(shù)據(jù)。在實(shí)際的應(yīng)用中,一般都要與數(shù)據(jù)庫(kù)打交道,如果不想用數(shù)據(jù)庫(kù),那么原因可能就是操作數(shù)據(jù)庫(kù)麻煩,創(chuàng)建數(shù)據(jù)庫(kù)環(huán)境也麻煩。但通過(guò) Django 的 model 處理,它是一種 ORM (Object Relation Mapping, 對(duì)象與關(guān)系的映射),可以屏蔽掉底層數(shù)據(jù)庫(kù)的細(xì)節(jié),同時(shí)提供以對(duì)象的形式來(lái)處理數(shù)據(jù)。非常方便。而且 Django 的 model 層支持多種數(shù)據(jù)庫(kù),如果你改變數(shù)據(jù)庫(kù)不是問(wèn)題,這也為以后的數(shù)據(jù)庫(kù)遷移帶來(lái)好處。Wiki 是 model 的名字,它需要從 models.Model 派生而來(lái)。它定義了兩個(gè)字段,一個(gè)是字段是 pagename , 用來(lái)保存 wiki 頁(yè)面的名字,它有兩個(gè)參數(shù),一個(gè)是最大長(zhǎng)度(從這點(diǎn)上不如 SQLAlchemy 方便, SQLAlchemy并不需要長(zhǎng)度,它會(huì)根據(jù)有無(wú)長(zhǎng)度自動(dòng)轉(zhuǎn)為 TEXT 類(lèi)型),目前 CharField 需要這個(gè)參數(shù);另一個(gè)是 unique 表示這個(gè)字段不能有重復(fù)值。還有一個(gè)字段是 content ,用來(lái)保存 wiki 頁(yè)面的內(nèi)容,它是一個(gè) TextField 類(lèi)型,它不需要最大長(zhǎng)度。在運(yùn)行時(shí), Django 會(huì)自動(dòng)地為這個(gè) model 增加許多數(shù)據(jù)操作的方法。關(guān)于 model 和 數(shù)據(jù)庫(kù)操作API的詳細(xì)內(nèi)容參見(jiàn) Model reference 和 Database API reference 的文檔。4修改 settings.py, 安裝 app雖然我們的其它工作沒(méi)有做完,但我還是想先安裝一下 app 吧。每個(gè) app 都需要安裝一下。安裝一般有兩步:1. 修改settings.py INSTALLED_APPS = ( django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.sites, newtest.wiki,)2. 執(zhí)行(在newtest目錄下) manage.py syncdb以前是使用 install wiki ?,F(xiàn)在也可以使用,不過(guò)使用 syncdb 要更簡(jiǎn)單得多。如果沒(méi)有報(bào)錯(cuò)就是成功了。這一步 Django 將根據(jù) model 的信息在數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的表。5在命令行下加入首頁(yè)(FrontPage)我們假設(shè)首頁(yè)的名字為 FrontPage ,并且我們將在命令行下增加它,讓我們熟悉一下命令行的使用,進(jìn)入 newtest 目錄,然后:manage.py shell進(jìn)入 python from newtest.wiki.models import Wiki page = Wiki(pagename=FrontPage, content=Welcome to Easy Wiki) page.save() Wiki.objects.all() p = Wiki.objects.all()0 p.pagenameFrontPage p.contentWelcome to Easy Wiki因?yàn)樵趯?xiě)這篇教程時(shí)是在magic-removal分枝下進(jìn)行的操作,因此有些 API 并不穩(wěn)定。象 objects 的方法以前是沿用model的方法,但后來(lái)進(jìn)行了簡(jiǎn)化,比如 get_list() 變?yōu)?all() 。還有一系統(tǒng)的變化。具體的可參見(jiàn) Removing The Magic 文檔中關(guān)于 Descriptor fields 的說(shuō)明。在

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論