Django2 視圖1使用指南 視圖2使用指南 登錄/註冊/登錄狀態權限驗證指南 登錄/註冊/登錄狀態權限驗證指南 實現圖片上傳展示等操作指南

視圖1使用指南

前言

MVT模式中的V,V代表視圖,在Django中的視圖主要用來接受web請求,並做出響應。視圖的本質就是一個python中的函數
視圖的響應分爲兩大類
以json數據形式返回
以網頁的形式返回
重定向到另一個網頁
錯誤視圖頁面(404,500等)
視圖響應的過程:瀏覽器輸入 → django獲取信息並去掉ip:端口,身下路徑 → urls路由匹配 → 視圖響應 → 回饋到瀏覽器

1. url配置

1.1 配置流程
settings中制定根級url配置文件,對應的屬性ROOT_URLCONF
1.2 urlpatterns
一個url實例的對象,全在根配置搞定
    內部由url組成(正則匹配路徑)
    url(r‘^learn/’, views.learn)
1.3 導入其他的url配置
在應用中創建urls.py 文件,編寫配置規則,在工程urls.py中進行
導入包含
    From django.conf.urls import include
    urlpatterns = [url(r’^xxx/’, include(‘app.urls’))]
注意:
    url配置正則注意事項:
        正則匹配時從上到下進行遍歷,匹配到就不會繼續向後查找了
        匹配的正則前方不需要加反斜槓
        正則錢需要加(r)表示字符串不轉義

2. 獲取url路徑的參數

2.1 url傳遞一個參數
如果需要從url中獲取一個值,需要對正則加小括號
url(r‘^grade/(\d+)$’, views.getStudent)
注意,url匹配中添加了()取參,在請求調用的函數中必須接收 def getStudent(request, classid)
2.2 url傳遞多個參數
如果需要獲取url路徑中的多個參數,那就添加多個括號,默認按照順序匹配路徑名字,參數順序必須固定
定義url中傳遞三個參數的地址:
    url(r‘^news/(\d{4})/(\d)+/(\d+)$’, views.getNews)
    實現方法:匹配年月日 def getNews(requests, year, month, day)

例子:查找計算機技術書籍下的腳本語言中的python的書籍信息


2.3 使用關鍵詞獲取參數

參數也可以使用關鍵字參數形式,參數順序可以任意
url(r’news/(?P<year>\d{4})/(?P<month>\d)+/(?P<day>\d+)$’, views.getNews)


3. 反向解析

3.1 在模板中進行反解析

關鍵字參數{% url namespace:name key=value key1=value1 %}

定義url:
在根urls中 url(r’^apps/’, include(‘App.urls’, namespace=’app’)) 在子urls中 url(r’^hello/(\d+)’, views.hello, name=’sayhello’)
在模板中使用:
<a href=’{% url ‘app:sayhello’ grade_id%}’> 其中grade_id是參數,其中參數可以使用位置參數,也可以使用關鍵詞參數,和配置urls一樣


3.2 在views中使用反向解析

使用反向解析優點
如果在視圖中,模板中使用硬編碼連接,在url配置發生改變時,需要變更的代碼會非常多,這樣導致我們的代碼結構不是很容易維護,使用反向解析可以提高我們代碼的擴展性和可維護性

    HttpResponseRedirect(reverse(namespace:name, kwargs = {key1 : value1, key2 : value2}))
    kwargs 是字典



4. 視圖

4.1 錯誤視圖

位置:通常在應用下的views.py中定義
錯誤視圖:
404視圖(頁面沒有被找到 page not found)
400視圖(客戶端操作錯誤 bad request)
403視圖(權限錯誤 403 forbidden )
500視圖(服務器內部錯誤 server error)

4.2 自定義錯誤視圖
4.2.1 修改debug模式

在工程的settings中修改debug模式:
注意:
需要在debug=False的情況下才可以
沒有關閉debug的情況下會在界面中直接顯示錯誤的信息

4.2.2 在templates文件中定義自己的錯誤樣式

5.請求與響應

5.1 HttpRequest定義
服務器在接收到http請求後,會根據報文創建HttpRequest對象
視圖中第一個參數就是HttpRequest對象
Django框架會進行自己的包裝,之後傳遞給視圖
屬性:
    path        請求的完整路徑
    method   請求的方法,通常get,post
    Encoding 編碼方式,常用utf-8
    Get          類似字典的參數,包含了get的所有參數
    post           類似字典的參數,包含了post的所有參數
    Files         類似字典的參數,包含了上傳的文件
    Cookies    字典,包含了所有的COOKIES
    Session    類似字典,表示會話
    方法: is_ajax()   判斷是否是ajax(),通常在移動端和js中
5.2 響應QueryDict類型
    1)類似字典的結構數據,與字典的區別,可以存在相同的鍵
    2)GET和POST都是QueryDict對象
    3)QueryDict中數據獲取方式
        dict[‘name’] 或者dict.get(‘name’)
        獲取指定key對應的所有值
        dict.getlist(‘name’)

如下,獲取重複提交數據的方法:

5.3 響應
1)可以直接返回一個HttpResponse對象:
    服務器返回給客戶端的數據,HttpResponse由程序員自己創建
    不使用模板,直接HttpResponse()
2)可以返回模板
調用模板,進行渲染,直接使用render一步到位
返回表達式:
    render(request, template_name, context)
        request  請求體對象
        template_name  模板路徑
        context  字典參數,用來填坑

3)屬性
    Content   返回的內容
    Charset   編碼格式
    status_code  響應狀態碼(200,4xx,5xx)
        4xx 客戶端的錯誤
        5xx 服務端的錯誤
    content_type   MIME類型,定義傳輸類型的,比如有xml,html,png等等,比如content_type=’image/jpg’
4)方法
    init    初始化內容
    write(xxx) 直接寫到文本
    flush 沖刷緩衝區
    set_cookie(key, value=’’, max_age=None, exprise=None)
    delete_cookie(key)   刪除cookie,上面是設置
4)重定向
    HttpResponseRedirect響應重定向:可以實現服務器內部的跳轉
    Return HttpResponseRedirect(‘/xxx/xxx’)
    使用的時候推薦使用反向解析
    JsonResponse
    使用json數據的請求,通常用在異步請求上jsonResponse(dict)
    content_type是application/json

視圖2使用指南

前言

回話技術,比如在做登錄功能的時候,需要配合是用存儲在客戶端的cookie信息,以及存儲在服務端的session來實現登錄功能。
在cookie中保存了用戶的信息,特別是一個特殊的令牌信息,當用戶拿着這個特殊的令牌來訪問網站的時候,網站會從cookie中
獲取這個特殊令牌去數據庫session中去查詢是否有這個對應的令牌的信息,如果有則驗證成功,就可以把用戶的信息返回給客戶端
了,如果驗證失敗則提示用戶沒有登錄等等提示信息。

cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。

cookie的工作原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。

cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。

問題來了,基於http協議的無狀態特徵,服務器根本就不知道訪問者是“誰”。那麼上述的cookie就起到橋接的作用。

我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。

總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。

另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架

1. cookie

HTTP 協議是無狀態的。因此,若不借助其他手段,遠程的服務器就無法知道以前和客戶端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一個典型的應用場景,就是用於記錄用戶在網站上的登錄狀態。

用戶登錄成功後,服務器下發一個(通常是加密了的)Cookie 文件。
客戶端(通常是網頁瀏覽器)將收到的 Cookie 文件保存起來。
下次客戶端與服務器連接時,將 Cookie 文件發送給服務器,由服務器校驗其含義,恢復登錄狀態(從而避免再次登錄)。

1.1 描述
瀏覽器端的回話技術
cookie本身由瀏覽器生成,通過Response將cookie寫在瀏覽器上,下一次訪問,瀏覽器會根據不同的規則攜帶cookie過來
1.2 cookie方法
設置:response.set_cookie(key, value, max_age=None, exprise=None)

獲取:request.GET.get(key)

刪除:request.delete_cookie(key)

注意:cookie不能跨瀏覽器

參數定義:

max_age和exprise時間:

max_age :  整數,指定cookie過期時間,以秒爲單位

exprise: 整數,指定過期時間,還支持是一個datetime或者timedelta,可以指定一個具體日期時間


設置10天后過期:

exprise=datetime.datetime.now() + timedelta(days=10) 10天后過期

永不過期:

exprise設置爲None表示爲永不過期

2. session

2.1 描述
服務端會話技術,依賴於cookie
2.2 開啓session設置

1)django中啓用SESSION

在settings中修改如下地方

INSTALLED_APPS:
    ‘django.contrib.sessions’

MIDDLEWARE:
    ‘django.contrib.sessions.middleware.SessionMiddleware’

每個HttpResponse對象都有一個session屬性,也是一個類字典對象

2.3 常用操作
request.session[‘user’] = username 設置數據

request.session.get(key, default=None) 根據鍵獲取會話的值

request.session.flush() 刪除當前的會話數據並刪除會話的cookie,django.contrib.auth.logout() 函數中就會調用它。

request.session.session_key  獲取sessionid值

request.session.delete(request.session.session_key) 刪除當前用戶的所有Session數據

del request.session['key'] 刪除session中的key值

request.session.set_expiry(value)
    如果value是個整數,session會在些秒數後失效
    如果value是個datatime或timedelta,session就會在這個時間後失效。 
    如果value是0,用戶關閉瀏覽器session就會失效。


數據存儲到數據庫中會進行編碼使用的是base64

代碼如下:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse


def index(request):
if request.method == 'GET':
username = request.session.get('username')
# username = request.session['username']
print(username)
# 獲取session_key
session_key = request.session.session_key
print(session_key)
# 刪除session整條記錄
request.session.delete(session_key)
# 刪除session中的數據
del request.session['username']
username = request.session.get('username')
print(username)
return render(request, 'index.html')


def setCookie(request):
if request.method == 'GET':
res = HttpResponseRedirect(reverse('myapp:index'))
# 設置cookie值
# set_cookie(key, value, max_age, expires)

        # 刪除:delete_cookie(key)  set_cookie(key, value, max_age=0)
        # res.set_cookie('session_id', '12t861ihafiagdfi', max_age=3)
        # res.delete_cookie('session_id')

        # 設置cookie中的值,並且設置session中的值
        # 登錄的時候,進行驗證用戶的用戶名和密碼是否正確,如果正確
        request.session['login'] = True
        request.session['username'] = '張三'
        request.session['password'] = '123456'
        return res

注意:

Session 支持中文  cookie不支持中文   token自己維護

實現原理:

存儲值原理圖:

3. 用戶認證系統的cookies和session的工作流程:

  1. 當用戶使用用戶名和密碼進行登錄認證,如果認證成功,則返回一個response響應,並綁定cookie。cookie中需設置一個鍵值對,鍵爲sessionID,值爲隨機字符串。
  1. 服務端以發送給客戶端cookie中的隨機字符串爲鍵,用戶的基本信息爲值,將數據保存起來。
  1. 當用戶下次發送URL請求,服務端可以通過cookie中的隨機字符串,找到在服務端中保存用戶的基本信息。

登錄/註冊/登錄狀態權限驗證指南

前言

通過cookie和token去實現登錄功能,用戶在登錄賬號以後,隨機產生一個隨機數並存在cookie中,並在服務端也存儲同一個數在數據庫中。
當下一次url請求過來的時候,解析request中綁定的cookie信息,解鎖出之前存的隨機數,判斷該隨機數是否是存儲在服務器端的數據,如果
沒有查詢到則表示該cookie過期,或者該cookie是僞造的,或者服務器上存儲該信息的數據緩存到期被清空了。則該提示用戶重新登錄,並且
重新產生隨機數,並存儲在cookie中以及服務端,以保證下次請求和響應能夠順利。

習題

題目:

  1. 編寫一個方法,用於註冊用戶的賬號和密碼。

  2. 編寫一個方法,用於登錄用戶的賬號和密碼,並且登錄的時候綁定一個加密的參數在cookie上,並且該加密參數也存儲在服務端中。

3)在以後的任意一個請求,我們都獲取request中的cookies,查看cookie中綁定的參數是否合法,以及查詢是否在服務端存儲了。

4)如果驗證成功則返回請求url的結果信息到頁面,如果驗證失敗則返回錯誤提醒信息頁面

  1. 註銷登錄

6)定義裝飾器去驗證用戶登錄以後才執行對應的視圖函數,反之跳轉到登錄頁面中

1. 註冊方法

從頁面中獲取賬號和密碼,進行創建

2. 登錄,並且綁定參數到cookie上

先檢驗用戶名是否在數據庫中,如果查詢到則繼續驗證密碼, 如果密碼驗證對,則綁定一個參數到cookie中。
解析密碼,加密密碼來源與一下的模塊:

from django.contrib.auth.hashers import check_password, make_password

3. 在方法中驗證cookie中傳遞的參數是否正確

cookie是在用戶提交url請求的時候都會帶上的一個參數,所以可以從中獲取到我們設置的參數,並且在服務端進行驗證,看服務端有這個標識符沒有,
如果能查詢到,則表示用戶登錄過了,並且還在登錄時效內,則直接返回用戶提交url對應的響應。如果在服務端沒有查詢到數據,則表示標識符過期,
或者無效了,需要登錄了,則直接提示錯誤信息即可!

4. 註銷登錄

刪除cookie中的認證令牌

5. 通過定義裝飾器去驗證用戶是否是登錄狀態,如果不是,則跳轉到登錄

定義裝飾器--閉包

登錄/註冊/登錄狀態權限驗證指南

前言

在django中,django幫我們封裝好了登錄註冊以及註銷的函數,在下面的代碼案例中,我們將使用django定義好的註冊登錄註銷函數去實現用戶的登錄驗證,用戶登錄,以及用戶註銷等操作,以及定義login_rqueired裝飾器,去裝飾我們定義的函數,實現登錄才能處理對應的業務邏輯

1. 實現註冊方法

1.1 頁面提交註冊字段

在頁面的form中有一下三個字段,用戶名和密碼1和密碼2,頁面在submit提交的時候,會提交該三個字段後後端,在後端中獲取該參數即可

1.2 後端處理註冊的信息

後端獲取前端傳遞的參數,進行簡單的驗證後,進行創建用戶的信息

2. 實現登錄方法

2.1 登錄頁面提交登錄的字段

2.2 後端進行登錄的驗證

3. 實現註銷方法

4. 登錄驗證

from django.contrib.auth.decorators import login_required

使用login_required裝飾器去裝飾自定義的視圖函數

實現圖片上傳展示等操作指南

前言

在很多開發功能裏面都涉及到需要上傳圖片的地方,比如頭像,或者封面圖,或者內容中插入圖片信息等,此指南就是來簡單的實現一個圖片文件上傳並且展示的功能演示

習題

題目:

  1. 編寫一個頁面,用於提交數據,包括用戶的名稱,和頭像圖片
  2. 編寫一個方法,用戶保存頁面提交的用戶名稱和圖片信息,將圖片保存到指定的文件夾中
    3)配置靜態頁面解析,在頁面中展示出上傳圖片

0. 安裝處理圖片的庫

pip install Pillow

1. 修改配置信息

在工程目錄中,修改setting.py文件,在最後面加入一下配置信息:

在urls.py文件中加入信息
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 定義模型

在模型中加入ImageFiled字段,並且指定上傳的圖片的保存路徑

3. 在頁面中傳遞圖片信息,和用戶名信息

4. 在服務端接受請求,並且保存圖片信息

5. 頁面展示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章