Django_視圖

視圖介紹和項目準備

  • 視圖就是應用中的views.py文件中的函數
# 視圖的第一個參數必須爲HttpRequset對象,
    - 通過正則表達式組獲取的位置參數
    - 通過正則表達式組獲得的關鍵字參數
# 視圖必須返回一個HttpResponse對象或子對象作爲響應
    - 子對象:JsonResponse HttpResponseRedirect
# 視圖負責接受Web請求HttpRequest,進行邏輯處理返回響應HttpResponse給請求者
    - 響應內容可以是HTML內容,404錯誤,重定項,json數據

項目準備

  • 創建項目+創建應用+安裝應用+配置模板路徑+本地化+mysql數據庫+URLconf+視圖

URLconf

# 配置URLconf
1.settings.py中指定url配置
ROOT_URLCONF = “項目.urls”
2.項目中urls.py
url(正則, include('應用.urls'))
3.應用中urls.py
url(正則, views.函數名)
# URL中取值
## 如果想從URL中獲取值,需要在正則表達式中使用分組,一下兩種方式
位置參數:參數的位置不能錯
 url(r'^(\d+)/(\d+)/$', views.index),
關鍵字參數:參數的位置可以變,跟關鍵字保持一致即可
url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),
# 注意:兩種參數的方式不要混合使用,在一個正則表達式中只能使用一種參數方式

錯誤視圖

404錯誤:page not found視圖
    - url匹配不成功會發生404錯誤
400錯誤:bad request視圖
    - 來自客戶端的安全方面非法操作會引發400錯誤
500錯誤:server error視圖
    - 在視圖中代碼運行報錯會發生500錯誤
# 只需要在模板中定義指定html文件即可,不需要配置URLconf和準備視圖,但是要配置模板加載路徑
DEBUG = False  # 線上模式 Django不在提供靜態文件的處理,因爲Django擅長處理動態邏輯,靜態處理交給nginx服務器處理
ALLOWED_HISTS = ['*']

HttpRequest對象

  • HttpRequest對象屬性幾乎都是隻讀的,用於讀取請求報文,不是用來設置請求報文的
# 常見屬性
path:一個字符串,表示請求的頁面的完整路徑,不包含域名
method:一個字符串,表示請求使用的HTTP方法,常用值包括:GET、POST
GET:一個類似於字典的QueryDict對象,含get請求方式的所有參數,?後面的內容
POST:一個類似於字典的QueryDict對象,含post請求方式的所有參數
FILES:一個類似於字典的QueryDict對象,包含所有的上傳文件
COOKIES:一個標準的Python字典,包含所有的cookie,鍵和值都爲字符串
encoding:一個字符串,表示提交的數據的編碼方式
session:一個既可讀又可寫的類似於字典的對象,表示當前的會話,只有當Django 啓用會話的支持時纔可用

# QueryDict對象

* 定義在django.http.QueryDict中
* HttpRequest對象的GET、POST屬性都是QueryDict類型的對象
* QueryDict類型的對象可以用來處理同一個鍵帶有多個值的情況
* QueryDict類型的對象,鍵和值都是字符串類型
    - 鍵是開發人員在編寫代碼時確定下來的
    - 值是根據數據生成的
* 注意:QueryDict類型的對象不是字典,僅僅是類似字典的對象而已
- 相關方法
get(): 根據鍵獲取值
    - 如果一個鍵同時擁有多個值將獲取最後一個值
    - 如果鍵不存在則返回None值,可以設置默認值進行後續處理
dict.get('鍵',默認值)
可簡寫爲
dict['鍵']
getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
    - 如果鍵不存在則返回空列表[],可以設置默認值進行後續處理
dict.getlist('鍵',默認值)

# GET屬性

* get請求時url格式,在請求地址結尾使用?,之後以“鍵=值”的格式拼接,多個鍵值對之間以&連接
 一鍵一值                  #參數
 http://127.0.0.1:8000/get/?a=10&b=20&c=python

 一鍵多值                  #參數
 http://127.0.0.1:8000/get/?a=10&b=20&a=python

# POST屬性

* 使用form表單提交請求時,method方式爲post則會發起post方式的請求
# HttpResponse對象
* 在django.http模塊中定義了HttpResponse對象的API
* HttpRequset對象有Django創建,HttpResponse對象由開發人員創建

## 常見屬性

content: 表示返回的內容
charset: 表示response採用的編碼字符集,默認utf-8
status_code: 返回的HTTP響應狀態碼
content_type: 指定返回數據的MIME類型,默認'text/html'(text/plain, text/xml, application/json)

## 常見方法

init: 創建HttpResponse對象後完成返回內容的初始化
write: 向響應體中寫數據
set_cookie: 設置Cookie信息
# cookie是網站以鍵值對格式存儲在瀏覽器中的一段純文本信息,用以實現用戶跟蹤
# max_age是一個整數,表示在指定秒數後過期
# expires是一個datetime或timedelta對象,回話將在這個指定的日期/時間過期
# max_age與expires二選一
# 如果不指定過期時間,默認兩個星期後過期
set_cookie('key', 'value', 'max_age=None', expires=None)
delete_cookie: 刪除指定的key的Cookie,如果key不存在則什麼也不發生
delete_cookie('key')

### 調用模板-簡寫
render()函數和HttpResponse()函數都是返回數據給請求者
render()函數封裝主要三個步驟
  1.定義上下文-->獲取模板-->渲染模板
  2.該函數就是讓模板語言去執行

# JsonResponse
 - JsonResponse 繼承自HttpResponse,被定義在django.http模塊中,接收字典作爲參數(也可以接收列表作爲參數)
 - 使用場景:當需要響應json數據給請求者,需要用到JsonResponse,響應內容格式默認json
 - JsonResponse的content_type默認爲application/json 

## 實現需求
1.準備URLconf,視圖,模板
2.導入 jquery 靜態文件
3.發起ajax請求
4.響應json字典
5.處理json字典,構造html內容

# HttpResponseRedirect
- 前提:當服務器處理完某種邏輯,不需要用戶點擊界面,即可把該響應交給瀏覽器,瀏覽器收到該響應,讀取響應當中的地址信息,最後跳轉到響應當中的地址
-點擊登錄按鈕的本質,不是跳轉界面,是將登陸表單信息發送給服務器,服務器處理登陸成功,響應重定向給瀏覽器,瀏覽器自動跳轉頁面
- 從一個視圖轉到另外一個視圖(本質是視圖的請求地址),就是重定向,繼承自HttpResponse,被定義在django.http模塊中,返回狀態碼302
- HttpResponseRedirect  、 redirect(2個同級)

狀態保持

  • 瀏覽器請求服務器是無狀態
  • 無狀態:指一次用戶請求時,瀏覽器、服務器無法知道之前這個用戶做過什麼,每次請求都是一次新的請求。
  • 無狀態原因:瀏覽器與服務器是使用Socket套接字進行通信的,服務器將請求結果返回給瀏覽器之後,會關閉當前的Socket連接,而且服務器也會在處理頁面完畢之後銷燬頁面對象。
  • 實現狀態保持兩種方式:在客戶端存儲信息使用Cookie;在服務器端存儲信息使用Session
# Cookie
## key = value 的字符串
- Cookie:指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地的數據(通常經過加密)
- 應用:判定註冊用戶是否已經登錄網站。網站的廣告推送。購物車
- Cookie基於域名安全,不同域名的Cookie是不能互相訪問的
設置Cookie
response.set__cookie('mark','hello')
讀取Cookie
c= request.COOKIES['mark']
判斷是否存在某個Cookie
if request.COOKIES.has__key('mark')
刪除Cookie
response.delete__cookie('mark')

# Session
## 默認session都已經準備好了可以直接使用

- 對於敏感、重要的信息,建議要存儲在服務器端,不能存儲在瀏覽器中
- 在服務器端進行狀態保持的方案就是Session
- Session依賴於Cookie

## Session存儲

- Django默認啓用Session,禁用就是將Session中間件註釋即可
- 可以存儲在數據庫、緩存、Redis等,SESSION_ENGINE指定Session存儲方式
存儲在數據庫(默認存儲方式可不寫)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
存儲在緩存中,丟失則不能找回,比數據庫的方式讀寫更快
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
混合存儲:優先從本機內存中存取,如果沒有則從數據庫中存取
SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'

## Session操作

 - 通過Session屬性進行回話讀寫操作,以鍵值對的格式操作
設置Session
# 先把狀態保持的信息,寫入到django_session表,再把該數據生成一個cookie信息,寫入到瀏覽器
request.session['鍵'] = 值
讀取Session
request.session.get('鍵', 默認值)
刪除指定鍵的值,在存儲中只刪除某個鍵對應的值
del request.session['鍵']
清除所有鍵的值,在存儲中刪除所有鍵對應的值
request.session.clear()
清除Session數據,在存儲中刪除所有鍵及對應的值,形成空表
request.session.flush()
設置回話的超時時間(默認2周)
request.session.set_expirt(value)
如果value是一個整數,會話將在value秒沒有活動後過期
如果value爲0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過期
如果value爲None,那麼會話則兩個星期後過期

配置流程

# 創建項目
django-admin startproject 項目名稱
# 創建應用
cd BookManager/
python manage.py startapp 應用名稱
#修改解釋器路徑
/home/python/.virtualenvs/py3_django/bin/python
# 運行服務器
python manage.py runserver
# 生成、執行遷移
python manage.py makemigrations
python manage.py migrate
# 界面本地化
LANGUAGE_COOE="zh-Hans"
TIME_ZONE="Asia/Shanghai"
# 創建管理員
python manage.py createsuperuser
# 配置URL
## 項目
url(r'^', include('Book.urls')),
## 應用
url(r'^booklist/$', bookList),
# 配置mysql數據庫
## init下
import pymysql
pymysql.install_as_MySQLdb()
## settings下
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Bookdb',
        'HOST': '192.168.80.132',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'mysql',
    }
}
# 創建模板文件夾templates,設置模板路徑
"DIRS":[os.path.join(BASE_DIR, "templates")]
# 創建靜態文件夾static,設置文件路徑
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
# 錯誤視圖配置(線上模式)
DEBUG = False
ALLOWED_HISTS = ['*']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章