Django檢視
阿新 • • 發佈:2018-12-11
作用
檢視接收web請求,並響應web請求
本質上檢視就是一個python中的函式
過程
1、使用者在瀏覽器中輸入網址
2、django獲取網址資訊,去除ip和埠,獲得虛擬路徑和檔名
3、將虛擬路徑與檔名傳給url管理器,管理器逐個匹配url並記住檢視函式名
4、去檢視中執行相應的檢視函式,檢視函式將相應的資料傳給瀏覽器
urls的配置
配置根級url配置檔案:setting.py中的ROOT_URLCONF,預設已經配置實現 urlpatterns:是一個url例項的列表,裡面存有多個url物件 url物件的格式:正則表示式、檢視名稱、別名 url匹配正則的注意事項: 1、如果想要從url中獲取一個值,需要對正則加小括號 2、匹配正則前方不需要加反斜槓,一般是在根級urls中的後面新增反斜槓 3、正則前需要加r表示字串不轉義 引入其他url配置,在應用中建立urls.py檔案,定義本應用的url,在站點urls.py檔案中使用include(),讓每個應用的url在自己下面完成
url方向解析
如果在檢視中使用了硬編碼連結,在url配置發生改變時,動態生成連結的地址(使用硬連結方便以後url發生改變時,不用去檢視和html中的連結) 在使用連結時.通過url配置的名稱,動態的生成url地址 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'blog/', include('app.urls',namespace='blog')), url(r'backweb/', include('backweb.urls',namespace='backweb')) ] urlpatterns = [ url(r'index',views.index,name='index') ]
檢視函式
定義檢視:
1、本質上檢視就是一個函式
2、引數:第一個引數是HtppRequest的例項(request名字不限定預設使用request,也叫請求物件,是瀏覽器傳送回來的,包括的瀏覽器發過來的所有內容),後面的引數是加括號的正則表示式獲取的引數
3、一般在views檔案下定義(也可以自己建立views1.py之類的檔案,但是不推薦使用)
錯誤檢視
404檢視:找不到網頁時(url匹配不成功)返回 配置settings.py: DEBUG --- 為Ture則永遠不會呼叫404頁面 ALLOWED_HOSTS=[*] --- 為*代表允許所有人訪問 500檢視:在試圖程式碼中出現錯誤程式碼 400檢視:錯誤出現在客戶的操作(例如伺服器發現爬蟲,發現錯誤的cookie等)
HttpRequest物件
概述:
1、伺服器接收http請求後,會根據報文建立HttpRequest物件(既是檢視函式的第一個引數可以,名字可以自己定,約定俗成的是request)
2、檢視的第一個引數就是HttpRequest物件
3、django建立的,之後呼叫檢視函式時傳遞給檢視
4、可以返回任意字串
屬性:
1、path --- 請求的完整路徑(不包括域名和埠,虛擬路徑和檔名)
2、method --- 請求的方式,常用的有GET、POST
3、encoding --- 表示瀏覽器提交的資料的編碼方式,一般為utf-8
4、GET --- 類似於字典的物件,包含了get的請求的所有引數
5、POST --- 類似於字典的物件,包含了post的所有引數
6、FILES --- 類似於字典的物件,包含了所有上傳的檔案
7、COOKIES --- 字典,包含所有的cookie
8、session --- 類似字典的物件,表示當前會話
方法:
is_ajax() --- 如果是通過XMLHttpRequest發起的,返回Ture
QuertyDict物件 --- request物件中的GET、POST都屬於Quertdict物件
方法:
get() --- 可以根據鍵獲取值,只能獲取一個值
格式:request.GET.get(鍵)
getlist() --- 將鍵的值以列表的形式返回,可以獲取多個值
格式:request.GET.getlist(鍵)
www.baidu.com/abc/a=1&b=2 --- 用get()獲取 --- 如果獲取到兩個a則報500錯誤
www.baidu.com/abc/a=1&a=2&a=3 --- 用getlist()獲取
GET屬性 --- 獲取瀏覽器傳遞給伺服器的資料
POST屬性 ---
使用表單提交實現post請求
request.POST.get('name') --- 獲取表單中name為'name'的值
如果提交的是複選框,則需要使用geytlist方法
HttpResponse物件
作用:給瀏覽器返回資料
HtppRequest物件由django建立的,HttpResponse物件由程式設計師建立
返回用法:
1、不呼叫模板,直接返回資料
return HttpResponse("post")
2、呼叫模板 --- render
render:redner(request,templiaeName[,context])
作用:結合資料和模板,返回完整的HTML頁面
引數:
request --- 請求體物件
templiaeName --- 模板的路徑
context --- 傳遞給需要渲染在模板上的資料
return render(request,'myApp/index.html',{'aa':aa})
屬性:
context --- 表示返回的內容和型別
charset --- 編碼格式
status_code --- 相應狀態碼(200,304,404)
content-type --- 指定輸出的MIME型別
例項:
res = HttpResponse --- 建立一個HttpResponse
re.context
方法:
init --- 使用頁面內容例項化HttpResponse物件
write(content) --- 以檔案的形式寫入
flush() --- 以檔案的形式輸出緩衝區
set_cookie(key,value,max_Age=None, exprise=None) --- 設定cookie
res = HttpResponse
cookie = res.set_cookie('name','good') --- 建立cookie
cookie = request.COOKIES --- 獲取cookie
res.write('<h1>' + cookie['name'] + '</h1>') --- 將cookie寫入瀏覽器
delete_cookie(key) --- 刪除cookie,如果刪除一個不存在的key就當什麼都沒發生
子類HttpResponseRedirect --- 功能,重定向(伺服器的跳轉)
return HttpResponseRedirect('/sunck/redirect2') --- 跳轉到相應的URL
簡寫redirect(to)
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirect1(request):
# return HttpResponseRedirect('/app/redirect2')
return redirect('/app/redirect2')
def redirect2(request):
return HttpResponse("我是重定向後的檢視")
子類JsonResponse ---返回json資料,一般用於非同步請求
當前端ajax請求資料型別為json時可以使用jsonResponse返回資料,也可以使用json模組將資料轉換成json資料。
resp = '請求成功re'
return HttpResponse(json.dumps(resp))
狀態保持
http協議時是無狀態的,每次請求都是一次新的請求,不記得以前的請求
實現狀態的保持,在客戶端或者伺服器儲存有關會話的資料
cookie --- 所有的資料儲存在客戶端,不存敏感的資料
session --- 所有的資料儲存在伺服器,在客戶端用cookie儲存session_id
狀態保持的目的 --- 在一段時間內跟蹤請求者的狀態,可以實現跨頁面訪問當前的請求者的資料
注意:不用的請求者之間不會共享,一對一
啟用session --- 在settings.py檔案中
INSTALLED_APPS --- 'django.contrib.sessions',
MIDDLEWARE --- 'django.contrib.sessions.middleware.SessionMiddleware',
啟用後,每個HttpRequest物件都有一個session,類似一個字典的物件
get(key,default=None) --- 根據鍵獲取session值,第二個引數是當查詢為空時,返回none,可以自己設定引數
username = request.session.get('name','遊客')
username = request.POST.get('username')
resquest.sesion['name'] =username --- 儲存session
clear() --- 清空當前的會話並刪除會話的cookie
flush --- 刪除當前的會話並刪除會話的cookie
session的使用
Django預設支援Session,並且預設是將Session資料儲存在資料庫中,即:django_session 表中。
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設)
SESSION_COOKIE_PATH = "/" # Session的cookie儲存的路徑(預設)
SESSION_COOKIE_DOMAIN = None # Session的cookie儲存的域名(預設)
SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(預設)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支援http傳輸(預設)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(預設)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(預設)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都儲存Session,預設修改之後才儲存(預設)
b. 使用
def index(request):
# 獲取、設定、刪除Session中資料
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設定
del request.session['k1']
# 如果del刪除以後資料還是沒有同步到數庫,可以告知伺服器資料已經發生改變,請求同步
del request.session[cart_id]
request.session.modified = True
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 使用者session的隨機字串
request.session.session_key
# 將所有Session失效日期小於當前日期的資料刪除
request.session.clear_expired()
# 檢查 使用者session的隨機字串 在資料庫中是否
request.session.exists("session_key")
# 刪除當前使用者的所有Session資料
request.session.delete("session_key")
request.session.clear()
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,使用者關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全域性session失效策略。
注意:
在django的session表中,只有當發生字典賦值或者刪除的情況才會將資料同步到資料表中。
單純的修改字典的值是不會判定為修改的,在修改值以後,需要執行request.session['鍵'] = 值的程式碼才會儲存到資料表中
如果執行上述以後還是不能講資料同步到資料庫,可以使用quest.session.modified = True告知伺服器資料已經發生改變