視圖介紹和項目準備
# 視圖的第一個參數必須爲HttpRequset對象,
- 通過正則表達式組獲取的位置參數
- 通過正則表達式組獲得的關鍵字參數
# 視圖必須返回一個HttpResponse對象或子對象作爲響應
- 子對象:JsonResponse HttpResponseRedirect
# 視圖負責接受Web請求HttpRequest,進行邏輯處理返回響應HttpResponse給請求者
- 響應內容可以是HTML內容,404錯誤,重定項,json數據
項目準備
- 創建項目+創建應用+安裝應用+配置模板路徑+本地化+mysql數據庫+URLconf+視圖
URLconf
1.settings.py中指定url配置
ROOT_URLCONF = “項目.urls”
2.項目中urls.py
url(正則, include('應用.urls'))
3.應用中urls.py
url(正則, views.函數名)
位置參數:參數的位置不能錯
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 啓用會話的支持時纔可用
* 定義在django.http.QueryDict中
* HttpRequest對象的GET、POST屬性都是QueryDict類型的對象
* QueryDict類型的對象可以用來處理同一個鍵帶有多個值的情況
* QueryDict類型的對象,鍵和值都是字符串類型
- 鍵是開發人員在編寫代碼時確定下來的
- 值是根據數據生成的
* 注意:QueryDict類型的對象不是字典,僅僅是類似字典的對象而已
- 相關方法
get(): 根據鍵獲取值
- 如果一個鍵同時擁有多個值將獲取最後一個值
- 如果鍵不存在則返回None值,可以設置默認值進行後續處理
dict.get('鍵',默認值)
可簡寫爲
dict['鍵']
getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值
- 如果鍵不存在則返回空列表[],可以設置默認值進行後續處理
dict.getlist('鍵',默認值)
* 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
* 使用form表單提交請求時,method方式爲post則會發起post方式的請求
* 在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信息
set_cookie('key', 'value', 'max_age=None', expires=None)
delete_cookie: 刪除指定的key的Cookie,如果key不存在則什麼也不發生
delete_cookie('key')
render()函數和HttpResponse()函數都是返回數據給請求者
render()函數封裝主要三個步驟
1.定義上下文
2.該函數就是讓模板語言去執行
- JsonResponse 繼承自HttpResponse,被定義在django.http模塊中,接收字典作爲參數(也可以接收列表作爲參數)
- 使用場景:當需要響應json數據給請求者,需要用到JsonResponse,響應內容格式默認json
- JsonResponse的content_type默認爲application/json
1.準備URLconf,視圖,模板
2.導入 jquery 靜態文件
3.發起ajax請求
4.響應json字典
5.處理json字典,構造html內容
- 前提:當服務器處理完某種邏輯,不需要用戶點擊界面,即可把該響應交給瀏覽器,瀏覽器收到該響應,讀取響應當中的地址信息,最後跳轉到響應當中的地址
-點擊登錄按鈕的本質,不是跳轉界面,是將登陸表單信息發送給服務器,服務器處理登陸成功,響應重定向給瀏覽器,瀏覽器自動跳轉頁面
- 從一個視圖轉到另外一個視圖(本質是視圖的請求地址),就是重定向,繼承自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(r'^', include('Book.urls')),
url(r'^booklist/$', bookList),
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Bookdb',
'HOST': '192.168.80.132',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'mysql',
}
}
"DIRS":[os.path.join(BASE_DIR, "templates")]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
DEBUG = False
ALLOWED_HISTS = ['*']