django tutorial

django web project的項(xiàng)目結(jié)構(gòu):

根目錄mysite/ 相當(dāng)于整個(gè)django web project的根炭庙。
manage.py 就是管理當(dāng)前web project的配置文件

第二個(gè)mysite/目錄相當(dāng)于是當(dāng)前web project的一個(gè)web app(也就是整個(gè)web工程的一個(gè)功能模塊)
每個(gè)web app下面需要有圖中給定的一些配置文件: 包括 init.py urls.py (剩下的 settings.py 和 wsgi.py 暫時(shí)不清楚是否每個(gè)web app目錄中都要有膛薛,或許是只有根 web app 目錄才需要有 這里以后要補(bǔ)充)

在一個(gè)web project下面創(chuàng)建新的web app使用命令
python manage.py startapp [appname]

比如在mysite下面運(yùn)行: python manage.py startapp polls 以后整個(gè)文件結(jié)構(gòu)是:

在web app下面增加新的頁(yè)面

比如:
(1)首先你需要在 polls/views.py 下面添加函數(shù)攘残,這個(gè)函數(shù)對(duì)應(yīng)著顯示一個(gè)url請(qǐng)求的頁(yè)面(有可能還負(fù)責(zé)處理當(dāng)前url對(duì)應(yīng)頁(yè)面的邏輯? 暫時(shí)還沒(méi)搞明白)
(python的web開(kāi)發(fā)框架好像都是按照一個(gè)函數(shù)一個(gè)頁(yè)面的原理進(jìn)行的)

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

(2)然后宝泵,你就需要在polls/urls.py內(nèi)映射本地web app的view 和 url的對(duì)應(yīng)關(guān)系(沒(méi)有urls.py則需要?jiǎng)?chuàng)建一個(gè))

from django.conf.urls import url
from . import views

#r在字符串前面代表不要轉(zhuǎn)義/,比如 r'^polls/test'薇正, 此時(shí) /t 就不轉(zhuǎn)義為制表符
#^貌似代表相對(duì)路徑洛心。比如在根urls.py下(如這里的mysite/mysite/urls.py)
# 如果是r'^polls/'則直接代表127.0.0.1:8080/polls/
#$代表路徑的結(jié)束符,文檔中好像說(shuō)有了 '/' 則不再需要聲明 '$'
urlpatterns = [
    url(r'^$', views.index, name='index'),  
]

(3)最后需要把 其他web app下的urls.py配置的url映射到根web app下的urls.py中葬毫,這里我們默認(rèn)mysite/urls.py是根urls.py 镇辉。
設(shè)置根urls.py好像是在settings.py中,具體設(shè)置這個(gè)有什么規(guī)范和限制暫時(shí)還不知道

from django.conf.urls import include, url
from django.contrib import admin

#在一個(gè)urls.py中包含其他urls.py需要使用 django.conf.urls.include 函數(shù)指定被包含的urls.py的相對(duì)地址
urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

最后就可以通過(guò)訪問(wèn) 127.0.0.1:8080/polls 或者 127.0.0.1:8080/admin 請(qǐng)求到對(duì)應(yīng)頁(yè)面贴捡。

啟動(dòng)django web service

啟動(dòng)django web service 的命令是:

(進(jìn)入web project目錄后忽肛,運(yùn)行)
python manage.py runserver [server ip address:port]

django url的配置問(wèn)題

Note that these regular expressions do not search GET and POST parameters, or the domain name. For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.
In a request to https://www.example.com/myapp/?page=3, the URLconf will also look for myapp/.

managy.py通過(guò)設(shè)置settings.py來(lái)和已導(dǎo)入web apps互動(dòng)

python manage.py shell

managy.py內(nèi)設(shè)置DJANGO_SETTINGS_MODULE的路徑:


在settings.py中,使用INSTALLED_APPS添加可用的web apps烂斋。 django自帶的通用app都在django.contrib下屹逛。 自定義的web app需要自己指定路徑



設(shè)置完這些之后,就可以通過(guò)調(diào)用manage.py訪問(wèn)到apps的各種資源(models, views, urls?)

django查找數(shù)據(jù)庫(kù)汛骂,創(chuàng)建數(shù)據(jù)庫(kù)表罕模,修改數(shù)據(jù)庫(kù)

都是通過(guò)調(diào)用web apps 下面的 models.py中的函數(shù)完成的(models.py中一個(gè)類(lèi)被看做數(shù)據(jù)庫(kù)中的一張table,類(lèi)里面定義了很多fields就是該表所擁有的所有屬性帘瞭,類(lèi)需要繼承django.db.models.Model類(lèi)淑掌,這樣才可以在web app的其他地方,比如view 里面調(diào)用models.py里面的類(lèi)從models.Model集成的方法去操作相應(yīng)的數(shù)據(jù)庫(kù)表蝶念,比如objects方法锋拖。)
比如:

類(lèi)Question在數(shù)據(jù)庫(kù)中定義了一張名為Question的表,里面含有屬性 question_text, pub_date祸轮。



我們可以調(diào)用Question.objects.[各種方法] 去訪問(wèn),操作Qustion表侥钳。
比如:


當(dāng)objects.get()查找不到表中的記錄時(shí)适袜,會(huì)拋出DoesNotExist異常,這個(gè)異常是被定義在相應(yīng)表的class下面的舷夺。

比如Qustion.objects.get(id=2)拋出DoesNotExist異常時(shí)苦酱,這個(gè)異常就是Question.DoesNotExist
我們相應(yīng)的就應(yīng)該這樣處理異常:

django操作models.py的類(lèi)售貌,往數(shù)據(jù)庫(kù)中添加記錄

django實(shí)例化models.py中的類(lèi),就是往相應(yīng)的數(shù)據(jù)庫(kù)表中添加記錄
比如:

#實(shí)例化一個(gè)Question
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save() #使用從django.db.models.Model繼承得來(lái)的save()方法疫萤,把實(shí)例對(duì)象當(dāng)作一條記錄存進(jìn)相應(yīng)的數(shù)據(jù)庫(kù)表中

django路徑匹配的過(guò)程

1.(先找ROOT_URLCONF定義的urls.py去匹配其中的urlpatterns)
2.如果找不到颂跨,則報(bào)錯(cuò);如果找到了扯饶,則把余下的url參數(shù)去匹配找到的那個(gè)web app的 urls.py中的urlpatterns恒削。
3.直到匹配到$為正常結(jié)束,或者沒(méi)匹配到$則算作沒(méi)匹配到尾序。
When somebody requests a page from your website – say, “/polls/34/”, Django will load the mysite.urls
Python module because it’s pointed to by the ROOT_URLCONF
setting. It finds the variable named urlpatterns and traverses the regular expressions in order. After finding the match at '^polls/', it strips off the matching text ("polls/") and sends the remaining text – "34/" – to the ‘polls.urls’ URLconf for further processing. There it matches r'^(P<ques
tion_id>[0-9]+)/$', resulting in a call to the detail()钓丰。

兩種渲染django默認(rèn)templates的方法

方法一:使用django.template.loader加載template實(shí)例,然后調(diào)用template實(shí)例的render方法每币,通過(guò)HttpResponse返回客戶端


方法二:直接調(diào)用django.shortcuts.render方法并返回給客戶端

定義通用的錯(cuò)誤處理頁(yè)面

(1)先建立一個(gè)web app用來(lái)存放所有出錯(cuò)頁(yè)面携丁,比如404,403兰怠,500等

python manage.py startapp errorpages

(2)在errorpages目錄下面創(chuàng)建templates文件夾梦鉴,用于存放前端模板(這里我還不會(huì)整合bootstrap,所以暫時(shí)使用html就好)
官方推薦的方式建立 errorpages的templates目錄結(jié)構(gòu)為:
mysite

  • errorpages
  • templates
  • errorpages
  • 404.html
  • 500.html
  • ...

(3)在mysite web project的根web app下面的settings.py中的INSTALLS_APPS揭保,添加errorpages的路徑肥橙。django只會(huì)查找INSTALLED_APPS中的所有web apps目錄下面的templates。因此掖举,為了能夠在errorpages中使用到templates快骗,需要完成本步驟。

image.png

(4)在errorpages的views.py中添加對(duì)應(yīng)錯(cuò)誤頁(yè)面的view類(lèi):
注意這里的模板的路徑塔次,只要從mysite/errorpages/templates的子目錄開(kāi)始寫(xiě)就行方篮,因?yàn)槲覀円呀?jīng)在mysite/mysite/settings.py中定義了errorpages是一個(gè)INSTALLS_APPS成員,所以励负,在errorpages/views.py中調(diào)用render_to_response去加載templates時(shí)藕溅,django就會(huì)自動(dòng)搜索到mysite/errorpages/templates目錄,然后再根據(jù)render函數(shù)調(diào)用時(shí)傳入的參數(shù)如:'errorpages/400.html'去查找上面那個(gè)目錄是否有400.html這個(gè)文件继榆。


(5)最后需要在mysite/mysite/urls.py 也就是根urls.py文件中映射錯(cuò)誤代碼和通用的錯(cuò)誤頁(yè)view巾表。


以上,就是定義通用錯(cuò)誤處理頁(yè)面的方法略吨。具體集币,遇到各種錯(cuò)誤后,的一些處理邏輯翠忠,可以根據(jù)需要添加在errorpages/views.py的對(duì)應(yīng)class中鞠苟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子当娱,更是在濱河造成了極大的恐慌吃既,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跨细,死亡現(xiàn)場(chǎng)離奇詭異鹦倚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冀惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)震叙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人云头,你說(shuō)我怎么就攤上這事捐友。” “怎么了溃槐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵匣砖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昏滴,道長(zhǎng)猴鲫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任谣殊,我火速辦了婚禮拂共,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻几。我一直安慰自己宜狐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蛇捌。 她就那樣靜靜地躺著抚恒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪络拌。 梳的紋絲不亂的頭發(fā)上俭驮,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音春贸,去河邊找鬼混萝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萍恕,可吹牛的內(nèi)容都是我干的逸嘀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼允粤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厘熟!你這毒婦竟也來(lái)了旗扑?” 一聲冷哼從身側(cè)響起屎媳,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎她按,沒(méi)想到半個(gè)月后阔挠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體飘庄,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年购撼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跪削。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迂求,死狀恐怖碾盐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揩局,我是刑警寧澤毫玖,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站凌盯,受9級(jí)特大地震影響付枫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驰怎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一阐滩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧县忌,春花似錦掂榔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鸳慈,卻和暖如春饱溢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背走芋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绩郎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翁逞。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓肋杖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挖函。 傳聞我的和親對(duì)象是個(gè)殘疾皇子状植,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容