1. 程式人生 > >Django檢視

Django檢視

作用

檢視接收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告知伺服器資料已經發生改變