日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web开发-Django视图层

發(fā)布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web开发-Django视图层 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Django視圖層

  • 簡述
    • Django框架處理業(yè)務的邏輯一般如下(省略圖,源于網(wǎng)絡,侵刪)
    • 可以看到,用戶在輸入網(wǎng)站的url之后看到的最直接的頁面就是視圖,而視圖是基于HTML模板文件進行渲染的,數(shù)據(jù)來源于數(shù)據(jù)庫也就是模型層。View是中間的關(guān)鍵部分,銜接HTTP請求、Python程序、HTML模板、ORM數(shù)據(jù)庫。
  • URL映射
    • URL分發(fā)(URL dispatcher)映射配置可以被看做Django項目的入口配置,通過URL dispatcher可以指定用戶的每一個訪問的后臺Python處理函數(shù)是什么。
    • 普通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),第一個參數(shù)是一個正則表達式(關(guān)于正則表達式這里不多說了,自行學習,Django路由用到的正則表達式是很簡單的,事實上對于很難的正則表達式有著一個說法:當你解決一個問題是決定要用正則表達式,那么。它就是兩個問題了。),決定了路由匹配模式,第二個變量是一個view函數(shù)名,決定請求被如何處理,返回什么結(jié)果。(路由不包括主機名)
    • 命名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ā)中,將整個項目的路由堆到一個urls.py文件里面不好也不太現(xiàn)實,對于每一個app都可以新建一個urls.py文件,使用時利用django.conf.urls中的include函數(shù)將其加入主配置的urls.py文件即可。(如上面代碼所示)app中的urls文件與主文件格式一致。
    • 反向解析
      • 除了從HTTP URL映射到視圖函數(shù)的功能外,Django提供了反向的從映射名到URL地址的反向解析功能。URL反向解析使得開發(fā)者可以使用映射名代替很多需要寫絕對URL映射的地方,提高了代碼的可維護性。
      • 在模板文件中使用{% url %}標簽調(diào)用反向解析(其實就是URL跳轉(zhuǎn));在Python程序中使用django.core.urlresolvers.reverse()函數(shù)進行反向解析。
      • 注意,為了反向解析的參數(shù)名,url中需要添加第三個參數(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ù)進行反向解析。
    • 視圖函數(shù)
      • 前面已經(jīng)使用了不少視圖函數(shù),這里來細說視圖函數(shù),
      • 當你輸入一個URL時,Django會到urlpattern里面查找第一個符合條件的,并得到這個路由設置的函數(shù),隨即將request帶給這個函數(shù),函數(shù)得到request請求,從中獲得數(shù)據(jù),返回一個HTTP Response。
      • 構(gòu)造返回的Response一般三種方式
        • 直接構(gòu)造HTTP Body
        • 用數(shù)據(jù)渲染HTML模板
        • 如果存在邏輯錯誤,返回HTTP錯誤或者其他狀態(tài)
      • 直接構(gòu)造HTML頁面
        • 對于簡單需求,返回一個含有字符串的HTML頁面即可,此時可以使用HttpResponse封裝這個字符串。
        • django.http.HttpResponse
      • 用數(shù)據(jù)渲染HTML文件
        • 例如將之前的year函數(shù)修改如下,將URL傳遞過來的year參數(shù)渲染到HTML頁面
        • def year(request, year):return render(request, 'render.html', {'year': year, })
        • 此時訪問/year/1998/就可以看到渲染后的結(jié)果。(注意HTML文件所在的templates文件夾需要在settings文件中模板相關(guān)的變量中設置路徑,具體可以查看我的源碼)
      • 返回HTTP錯誤
        • 可以使用HttpResponse傳遞參數(shù)status
        • 對于各種HTTP狀態(tài),Django已經(jīng)封裝了不少HttpResponse的子類,可以查看源碼使用。
    • 模板語法
      • 模板文件主要就是HTML文件配套CSS或者JS文件。
      • 除了HTML原有的語法,Django自定義了一套模板語法。
      • 變量替換
        • 在HTML文件的任何位置,都可以使用變量替換。
        • {{ data.a }}
        • 這里的data就是render時傳遞的參數(shù)字典中的一個值。
      • 過濾器
        • 放在變量后用于控制變量顯示格式的技術(shù),變量與過濾器使用管道符"|"連接,有Linux基礎(chǔ)的應該知道。
        • {{ data.a | upper }}
        • 將upper過濾器應用到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>
      • 模板繼承
        • 利用extends語句
        • 不細說,現(xiàn)在前端自然會有一個較好的邏輯。
  • 補充說明
    • 具體介紹了視圖層的相關(guān)內(nèi)容
    • 本項目參考書為《Python高效開發(fā)實戰(zhàn)》劉長龍著
    • 使用到的所有重要包會列在requirements.txt文件中
    • 具體代碼可以查看我的GitHub,歡迎star或者fork

總結(jié)

以上是生活随笔為你收集整理的Web开发-Django视图层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。