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快骗,需要完成本步驟。
(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中鞠苟。