一、Views
views模塊爲MVC中的C——Controller,邏輯處理,是連接MTV中model(數據庫數據)與Template(視圖模塊)的結合,將數據庫中的數據顯示到視圖中
視圖的本質就是一個python中的函數
Django中,視圖主要用來接受Web請求,並做出響應
視圖的響應分爲兩種:
- 以JSON數據形式返回
- 以網頁的形式返回(重定向到另一個頁面、錯誤視圖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
- Request
二、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是變量中存儲的數據