Web开发-Django视图层
生活随笔
收集整理的這篇文章主要介紹了
Web开发-Django视图层
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Django視圖層
- 簡(jiǎn)述
- Django框架處理業(yè)務(wù)的邏輯一般如下(省略圖,源于網(wǎng)絡(luò),侵刪)
- 可以看到,用戶在輸入網(wǎng)站的url之后看到的最直接的頁(yè)面就是視圖,而視圖是基于HTML模板文件進(jìn)行渲染的,數(shù)據(jù)來源于數(shù)據(jù)庫(kù)也就是模型層。View是中間的關(guān)鍵部分,銜接HTTP請(qǐng)求、Python程序、HTML模板、ORM數(shù)據(jù)庫(kù)。
- Django框架處理業(yè)務(wù)的邏輯一般如下(省略圖,源于網(wǎng)絡(luò),侵刪)
- URL映射
- URL分發(fā)(URL dispatcher)映射配置可以被看做Django項(xiàng)目的入口配置,通過URL dispatcher可以指定用戶的每一個(gè)訪問的后臺(tái)Python處理函數(shù)是什么。
- 普通URL映射
- 每個(gè)Django項(xiàng)目都有一個(gè)urls.py文件用于維護(hù)URL dispatcher。
- from django.conf.urls import url, includefrom django.contrib import adminurlpatterns = [url(r'^admin/', admin.site.urls),url(r'app/', include('app.urls')),url(r'app2', include('app2.urls'))]
- 不妨看上面這個(gè)路由演示文件。
- 在urls.py文件中必須聲明urlpatterns變量用來保存路由,每一個(gè)路由的形式為url(r'pattern',view_func),第一個(gè)參數(shù)是一個(gè)正則表達(dá)式(關(guān)于正則表達(dá)式這里不多說了,自行學(xué)習(xí),Django路由用到的正則表達(dá)式是很簡(jiǎn)單的,事實(shí)上對(duì)于很難的正則表達(dá)式有著一個(gè)說法:當(dāng)你解決一個(gè)問題是決定要用正則表達(dá)式,那么。它就是兩個(gè)問題了。),決定了路由匹配模式,第二個(gè)變量是一個(gè)view函數(shù)名,決定請(qǐng)求被如何處理,返回什么結(jié)果。(路由不包括主機(jī)名)
- 命名URL映射
- 在普通的URL參數(shù)映射中,固然可以通過URL傳遞參數(shù),但是參數(shù)是按照路徑中的順序傳遞給view函數(shù),這種方法不太友好。而命名URL參數(shù)映射使得開發(fā)者可以定義這些被傳遞參數(shù)的參數(shù)名稱,定義方式一般為?P<param_name>pattern。
- 如
- url(r'year/(?P<year>[0-9]{4})/', views.year),
- 訪問及結(jié)果如下
- 分布式URL映射
- 一般在開發(fā)中,將整個(gè)項(xiàng)目的路由堆到一個(gè)urls.py文件里面不好也不太現(xiàn)實(shí),對(duì)于每一個(gè)app都可以新建一個(gè)urls.py文件,使用時(shí)利用django.conf.urls中的include函數(shù)將其加入主配置的urls.py文件即可。(如上面代碼所示)app中的urls文件與主文件格式一致。
- 反向解析
- 除了從HTTP URL映射到視圖函數(shù)的功能外,Django提供了反向的從映射名到URL地址的反向解析功能。URL反向解析使得開發(fā)者可以使用映射名代替很多需要寫絕對(duì)URL映射的地方,提高了代碼的可維護(hù)性。
- 在模板文件中使用{% url %}標(biāo)簽調(diào)用反向解析(其實(shí)就是URL跳轉(zhuǎn));在Python程序中使用django.core.urlresolvers.reverse()函數(shù)進(jìn)行反向解析。
- 注意,為了反向解析的參數(shù)名,url中需要添加第三個(gè)參數(shù),name。
- url(r'year/(?P<year>[0-9]{4})/', views.year, name="when"),
- url(r'year2', views.year2),
- 視圖函數(shù)定義如下
- def year2(request):return HttpResponseRedirect(reverse('when', args=['1998']))
- 輸入http:127.0.0.1:8000/year2可以看到瞬間跳轉(zhuǎn)命名的視圖,并攜帶參數(shù)進(jìn)行反向解析。
- 視圖函數(shù)
- 前面已經(jīng)使用了不少視圖函數(shù),這里來細(xì)說視圖函數(shù),
- 當(dāng)你輸入一個(gè)URL時(shí),Django會(huì)到urlpattern里面查找第一個(gè)符合條件的,并得到這個(gè)路由設(shè)置的函數(shù),隨即將request帶給這個(gè)函數(shù),函數(shù)得到request請(qǐng)求,從中獲得數(shù)據(jù),返回一個(gè)HTTP Response。
- 構(gòu)造返回的Response一般三種方式
- 直接構(gòu)造HTTP Body
- 用數(shù)據(jù)渲染HTML模板
- 如果存在邏輯錯(cuò)誤,返回HTTP錯(cuò)誤或者其他狀態(tài)
- 直接構(gòu)造HTML頁(yè)面
- 對(duì)于簡(jiǎn)單需求,返回一個(gè)含有字符串的HTML頁(yè)面即可,此時(shí)可以使用HttpResponse封裝這個(gè)字符串。
- django.http.HttpResponse
- 用數(shù)據(jù)渲染HTML文件
- 例如將之前的year函數(shù)修改如下,將URL傳遞過來的year參數(shù)渲染到HTML頁(yè)面
- def year(request, year):return render(request, 'render.html', {'year': year, })
- 此時(shí)訪問/year/1998/就可以看到渲染后的結(jié)果。(注意HTML文件所在的templates文件夾需要在settings文件中模板相關(guān)的變量中設(shè)置路徑,具體可以查看我的源碼)
- 返回HTTP錯(cuò)誤
- 可以使用HttpResponse傳遞參數(shù)status
- 對(duì)于各種HTTP狀態(tài),Django已經(jīng)封裝了不少HttpResponse的子類,可以查看源碼使用。
- 模板語法
- 模板文件主要就是HTML文件配套CSS或者JS文件。
- 除了HTML原有的語法,Django自定義了一套模板語法。
- 變量替換
- 在HTML文件的任何位置,都可以使用變量替換。
- {{ data.a }}
- 這里的data就是render時(shí)傳遞的參數(shù)字典中的一個(gè)值。
- 過濾器
- 放在變量后用于控制變量顯示格式的技術(shù),變量與過濾器使用管道符"|"連接,有Linux基礎(chǔ)的應(yīng)該知道。
- {{ data.a | upper }}
- 將upper過濾器應(yīng)用到a上。
- 常見過濾器可以查看源碼。
- 流程控制
- 循環(huán)邏輯
- {% for data in datas %}<h> {{data.a}}</h>{% endfor %}
- 判斷邏輯
- {% if data.b < 10 %}<h1> {{data.a}}</h1>(% elif data.b < 20 %}<h2> {{data.a}} </h2>{% else %}<p> data.a </p>
- 循環(huán)邏輯
- 模板繼承
- 利用extends語句
- 不細(xì)說,現(xiàn)在前端自然會(huì)有一個(gè)較好的邏輯。
- 補(bǔ)充說明
- 具體介紹了視圖層的相關(guān)內(nèi)容
- 本項(xiàng)目參考書為《Python高效開發(fā)實(shí)戰(zhàn)》劉長(zhǎng)龍著
- 使用到的所有重要包會(huì)列在requirements.txt文件中
- 具體代碼可以查看我的GitHub,歡迎star或者fork
總結(jié)
以上是生活随笔為你收集整理的Web开发-Django视图层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web开发-Django模型层
- 下一篇: Web开发-Django表单