Python Django Views邏輯處理 及 Urls路由規則

一、Views

views模塊爲MVC中的C——Controller,邏輯處理,是連接MTV中model(數據庫數據)與Template(視圖模塊)的結合,將數據庫中的數據顯示到視圖中

視圖的本質就是一個python中的函數

Django中,視圖主要用來接受Web請求,並做出響應

視圖的響應分爲兩種:

  1. 以JSON數據形式返回
  2. 以網頁的形式返回(重定向到另一個頁面、錯誤視圖40X,50X)

視圖響應的過程:瀏覽器輸入——>django獲取信息並去掉IP:端口號,剩下路徑——>urls路由匹配——>視圖響應——>回饋到瀏覽器

Views  視圖函數

  • MTV中的View,相當於Controller作用,控制器  接收用戶輸入(請求),協調模版模型,對數據進行處理
  • 路由器urls
    • urlpatterns
    • 根路由url中,我們會使用include形式將整個子路由添加進來
      • 第一個參數:正則匹配的路徑
      • 第二個參數:包含那個路由
      • 第三個參數:namespace
    • 子路由中,前兩個參數一致
      • 第三個參數:name
      • 以後我們會根據namespace:name 動態獲取我們的路由(path)
    • 請求參數
      • 路徑參數
        • 位置參數
          • 使用圓括號包含規則
          • 一個圓括號代表一個參數
          • 代表視圖函數上的一個參數
          • 參數個數和視圖函數上的參數一一對應(除默認request)
        • 關鍵字參數
          • 可以在圓括號指定參數名字  (?P<name> reg)
          • 視圖函數中存在和圓括號中name對應的參數
          • 參數不區分順序
          • 個數也需要保持一致,一一對應
      • 請求參數
      • 反向解析
        • 在模版中使用
        • {% url %}
          • {% url 'namespace:name' %}
          • 如果存在位置參數:{% url 'namespace:name' value1 value2 ... %}
          • 如果存在關鍵字參數:{% url 'namespace:name' key1=value1 key2=value2 ... %}
      • 規則
        • 按照書寫順序,從上到下匹配
        • 沒有最優匹配的原則,匹配到就停止
  • 雙R
    • Request  
      • django框架根據Http請求報文自動生成的一個對象
      • 包含請求各種信息
      • path、method(GET、POST請求)、encoding、GET(QueryDict、類字典結構key-value,一個key可以對應多個值、get、getlist)、POST、FILES、COOKIES、session、is_ajax()
      • META:元信息  包括:客戶端id的所有信息、IP地址等
    • Response

 

二、Urls

路由

  • 按照列表的書寫順序進行匹配,從上到下匹配,沒有最優匹配的概念
  • 路由規則編寫:通常直接指定'xxx',在結尾添加反斜線  /,path(‘xxx/', views.xxx)

URL組成:http |  ://www.xxx.com  |  /xx/index/  |  ?u_token=xxx&u_time=14.37  |  #footer

  • http:schema協議    常見有http、https、ftp傳文件、rtmp直播流
  • www.xxx.com:域名  ip:port  http沒有書寫端口則默認是80端口
  • /xxx/index/:路徑path    相當於主機的絕對路徑
  • ?u_token=xxx&u_time=14.37:GET請求參數(QueryString 查詢參數)
  • #footer:錨點,頁面中的定位方式

路由路徑中參數使用()進行獲取

  • 一個圓括號對應視圖函數中
  • 參數:
    • 路徑參數
      • 位置參數:按照書寫順序進行匹配
      • 關鍵字參數:(?P<參數名稱>\d+)  按照參數名稱匹配,和順序無關
    • 參數個數必須和視圖函數中參數個數一致(除默認的request以外)

 

url反向解析:根據路徑中註冊的標識動態獲取路徑

使用反向解析的優點:如果在視圖模板中使用硬編碼連接,在url配置發生改變時,需要變更的代碼會非常多,這樣導致我們的代碼結構不是很容易維護,使用反向解析可以提高我們代碼的擴展性和可維護性。

  • 根據根路由中註冊的namespace和在子路由中註冊的name,這兩個參數來動態獲取我們的路徑
  • 在模版中使用 {% url 'namespace:name' %}
  • 如果帶有位置參數 {% url 'namespace:name' value1 value2 [valuen...] %}
  • 如果帶有關鍵字參數 {% url 'namespace:name' key1=value1 key2=value2 [keyn=valuen...]%}

 

Django使用時,2.0版更新後不能用之前include namespace的方式書寫

在網頁項目中使用include()方法
項目目錄中同時存在app/urls.py和proj/urls.py
在proj/urls.py使用include方法
from django.urls import path,include
from app import urls as app_url
urlpatterns = [
    path('xxx/', include(app_url, namespace='common')),
]

在app/urls.py中對應url
from django.urls import path
from .views import index
urlpatterns = [
    path('',index,name='index'),
]

runserver發生錯誤
django.core.exceptions.ImproperlyConfigured: 
Specifying a namespace in include() without providing an app_name is not supported. 
Set the app_name attribute in the included module, 
or pass a 2-tuple containing the list of patterns and app_name instead.
意思爲:
在include方法裏面指定namespace卻不提供app_name是不允許的。
在包含的模塊裏設置app_name變量,或者在include方法裏面提供app_name參數。

解決方法
在項目的urls.py文件中,即  proj/urls.py中修改

from django.urls import path,include
from app import urls as app_url
urlpatterns = [
    path('xxx/', include((common_url,'common'), namespace='common')),
]

方法2:在應用  app/urls.py中修改

from django.urls import path
from .views import index
app_name='common'
urlpatterns = [
    path('xxx/',index,name='index'),
]

 

使用方式:

在頁面html5文件中使用反向代理:

<a href="{% url 'second:learn' %}">Go Go Go</a>    #second 爲project urls中的namespace    learn爲App中的name

 

錯誤頁面定製

  • 在模版中重寫對應錯誤狀態碼頁面,例如新建404.html頁面
  • 關閉Debug
  • 實現原則:接近原則

 

雙R

Request

  • path    請求的完整路徑
  • method  請求的方法,常用GET,POST
  • encoding  編碼方式,常用utf-8
  • GET  類似字典的參數,包含了get的所有參數
    • 類字典結構
    • 一個key允許對應多個值
    • get、getlist
  • POST  類似字典的參數,包含了post的所有參數
  • FILES  類似字典的參數,包含了上傳的文件
  • COOKIES  字典,包含了所有COOKIE
  • session  類似字典,表示會話
  • 方法:is_ajax()  判斷是否是ajax(),通常用在移動端和js中
  • META
    • 各種客戶端元信息
    • REMOTE_ADDR遠端訪問IP

Resonse

 

知識點

locals

  • 內置函數
  • 將局部變量使用字典的方式進行打包
  • key是變量名,value是變量中存儲的數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章