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