40.django中重要概念

模板引擎

1.基本數據類型html

  • 字符串、整數、小數
  • 列表
  • 字典
  • 列表套字典

2.母版python

  • 母版頁面(layout.html)jquery

    {% block mycontent%}
    {% endblock %}
    
    {% block mycss%}
    {% endblock %}
    
    {% block myjs%}
    {% endblock %}
  • 子版頁面ajax

    {%extends "layout.html"%} 繼承母版
    
    {% block mycontent%}
     子版本身的內容
    {% endblock %}

3.導入模塊方式數據庫

使用include:{% include " xxx.html" %} 能夠導入對應模板中的內容django

4.內置函數後端

str='cc FF gg AA'

html模板中:
{{ str|upper }}     CC FF GG AA
{{ str|lower }}       cc ff gg aa
{{ str|first|upper }}   c
{{ str|truncatewords:"3" }}  cc FF gg...

5.自定義函數瀏覽器

a. 在app中建立templatetags目錄
b. 在上述的目錄中建立 xxx.py
c. 在xxx.py中,
from django import template

register = template.Library()

@register.filter
def my_filter(val, args):
    return val + args

@register.simple_tag
def my_upper(val, args, args1):
    return val + args + args1


在html中:
{%load xxx %}

- simple_filter
{{name | my_filter:'xxxxx'}}

- simple_tag
{%my_upper "zekai" "sss" 'dsadsadsa'%}

不建議在模板中使用函數, 由於會下降模板的渲染效率, 建議在視圖函數中直接處理, 而後渲染便可

cookie,session

cookie是存在於客戶端的,   
   它的做用是:
       驗證登陸信息的,經過使用 cookie完善登陸的邏輯

   爲了便於理解能夠把cookie看成記錄了登陸信息的小紙條,而且有必定的生效時間。
   cookie具體在網絡中的機制是:
   1.首先瀏覽器客戶端登陸訪問服務端時,服務端提供登陸頁面給瀏覽器
   2.瀏覽器端提交數據給服務器,至關於記錄信息(是session的機制)
   3.此時服務端會回寫cookie給瀏覽器,也就是至關於遞了一個小紙條給瀏覽器
   4.瀏覽器將cookie保存,併發送第二次請求,並且要帶上cookie
   5.服務端經過認證,能夠請求其餘數據。
      
   在python中具體的用法是:
 經過set_cookie這個函數,後面跟的參數有,key-value,
  是cookie的鍵值對,用來設定值,經過判斷來肯定是否須要登陸,
  後面有一個參數是max_age,表示登陸後生效的時間,超過此時間,           cookie會被清除,則須要再次登陸。
  
  還有expires也是表示生效時間,以年月日形式,最少設爲一天
  domain是表示生效的域名
  
  若是一個cookie被設置了Secure=true,那麼這個cookie只能用https協議發送給服務器,用http協議是不發送的 
  
  咱們能夠經過document.cookie打出cookie的內容
  只要經過設置HttpOnly=true,這樣cookie就不能被js獲取到    
       
  爲了安全性:咱們還能夠加鹽處理set_signed_cookie(key, val,  salt)
session在服務端,依賴於cookie的,用來登記信息

session機制:
1. 向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'}的cookie值
2. 將客戶的隱私信息保存在了服務端的數據庫中,也就是session保存在了數據庫中
默認放在django_session表中
{"dsjnalndjskanjdksa" : {"name":'xxx', 'age':18, 'addr':'dsabdsa'}}

#### 在視圖函數中設置session的方法:
request.session['name'] = username
request.session['age'] = 13

#### 獲取session
request.session.get('name')

### 默認session存在數據庫中的django_session表

#還能夠經過緩存,文件或者緩存加數據庫的方式保存session

中間件

在django中,瀏覽器和服務端之間發送請求和響應時須要經過中間件,在django的settings中,有一個 MIDDLEWARE_列表中,每個元素就是一箇中間件。緩存

當django處理一個 Request 的過程是首先經過中間件,而後再經過默認的 URL 方式進行的。咱們能夠在 Middleware 這個地方把全部Request 攔截住,用咱們本身的方式完成處理之後直接返回 Response。

中間件定義方法

中間件中能夠定義五個方法,具體以下:

Request預處理函數: process_request(self, request)

這個方法的調用時機在Django接收到request以後,但仍未解析URL以肯定應當運行的視圖函數。Django向它傳入相應的Request對象,以便在方法中修改。

若是返回None,Django將繼續處理這個request,執行後續的中間件, 而後調用相應的 view。

若是返回HttpResponse對象,Django將再也不執行任何除了process_response之外其它的中間件以及相應的view,Django將當即返回該HttpResponse。

View預處理函數: process_view(self, request, callback, callback_args,callback_kwargs)

這個方法的調用時機在 Django 執行完 request 預處理函數並肯定待執行的 view (即callback參數)以後,但在 view 函數實際執行以前。

request:HttpRequest 對象。

callback:Django將調用的處理request的python函數. 這是實際的函數對象自己, 而不是字符串表述的函數名。

args:將傳入view的位置參數列表,但不包括request參數(它一般是傳入view的第一個參數)。

kwargs:將傳入view的關鍵字參數字典。

process_view() 應當返回None或 HttpResponse 對象。若是返回 None, Django將繼續處理這個request ,執行後續的中間件, 而後調用相應的view。

若是返回 HttpResponse 對象,Django 將再也不執行任何其它的中間件(不論種類)以及相應的view,Django將當即返回。

Template模版渲染函數:process_template_response()

默認不執行,只有在視圖函數的返回結果對象中有render方法纔會執行,並把對象的render方法的返回值返回給用戶(注意不返回視圖函數的return的結果了,而是返回視圖函數 return值(對象)中rende方法的結果)

Exception後處理函數:process_exception(self, request, exception)

這個方法只有在 request 處理過程當中出了問題而且view 函數拋出了一個未捕獲的異常時纔會被調用。這個鉤子能夠用來發送錯誤通知,將現場相關信息輸出到日誌文件,或者甚至嘗試從錯誤中自動恢復。

這個函數的參數除了一向的request對象以外,還包括view函數拋出的實際的異常對象exception 。

process_exception() 應當返回None或HttpResponse對象。

若是返回None,Django將用框架內置的異常處理機制繼續處理相應request。

若是返回HttpResponse對象,Django將使用該response對象,而短路框架內置的異常處理機制。

Response後處理函數:process_response(self, request, response)

這個方法的調用時機在 Django 執行 view 函數並生成 response 以後。

該處理器能修改response 的內容;一個常見的用途是內容壓縮,如gzip所請求的HTML頁面。

這個方法的參數至關直觀:request是request對象,而response則是從view中返回的response對象。

process_response() 必須返回 HttpResponse 對象. 這個 response 對象能夠是傳入函數的那一個原始對象(一般已被修改),也能夠是全新生成的。

中間件執行流程

請求到達中間件以後,先按照正序執行每一個註冊中間件的process_request方法,process_request方法返回的值是None,就依次執行,若是返回的值是HttpResponse對象,再也不執行後面的process_request方法,而是執行當前對應中間件的process_response方法(注意不是掉頭執行全部的process_response方法),將HttpResponse對象返回給瀏覽器。也就是說:若是MIDDLEWARE中註冊了6箇中間件,執行過程當中,第3箇中間件返回了一個HttpResponse對象,那麼第4,5,6中間件的process_request和process_response方法都不執行,順序執行3,2,1中間件的process_response方法。

ZOZRu4.png

process_request方法都執行完後,匹配路由,找到要執行的視圖函數,先不執行視圖函數,先執行中間件中的process_view方法,process_view方法返回None,繼續按順序執行,全部process_view方法執行完後執行視圖函數。假如中間件3 的process_view方法返回了HttpResponse對象,則4,5,6的process_view以及視圖函數都不執行,直接從最後一箇中間件,也就是中間件6的process_response方法開始倒序執行。

ZOZWDJ.png

MVC,MTV

MVC模式:程序不論簡單或複雜,從結構上看,均可以分紅三層

1.最上面的一層,是直接面向最終用戶的」視圖層」(View)。它是提供給用戶的操做界面,是程序的外殼。
2.最底下的一層,是核心的」數據層」(Model),也就是程序須要操做的數據或信息
3.中間的一層,就是」控制層」(Controller),它負責根據用戶從」視圖層」輸入的指令,選取」數據層」中的數據,而後對其進行相應的操做,產生最終結果

MTV模式:django中特有的模式

1.M: model, 至關於model層,和mvc中的m同樣

2.T: Template, 至關於view層

3.V: view, 至關於controller層

Csrf攻擊

CSRF(Cross-site request forgery)跨站請求僞造攻擊,與XSS不一樣,XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶網頁瀏覽器的信任。

1.用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登陸網站A;

2.在用戶信息經過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登陸網站A成功,能夠正常發送請求到網站A;

3.用戶未退出網站A以前,在同一瀏覽器中,打開一個TAB頁訪問網站B;

4.網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;

5.瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的狀況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求實際上是由B發起的,因此會根據用戶C的Cookie信息以C的權限處理該請求,致使來自網站B的惡意代碼被執行。

防護這種攻擊能夠在請求地址中添加 token 並驗證

csrf(跨站請求僞造)

先寫一個簡單的post請求,復現報錯信息

釣魚網站:銀行轉帳的路徑,你是否也能夠拿到,而後你作一個跟銀行如出一轍的頁面,也超銀行的藉口提交數據,當用戶在釣魚網站輸入對方帳戶名和轉帳金額以後,點擊發送。其實內部是將對方帳戶換成了釣魚網站的造假人員的帳戶。形成你轉帳轉錯帳戶的狀況

開兩個django項目,模擬轉帳的現象

如何區分釣魚網站和正經網站?在正經網站返回頁面的時候,在form表單中偷偷塞一個特殊的字符串,後端記下改頁面對應的字符串的值,等用戶發post請求來的時候,我先去校驗特殊的字符串是否匹配

如何去寫這個特殊的字符串呢?模版語法有一個固定的寫法{% csrf_token %},必須寫在form表單內

瀏覽器查看改標籤的值,而且每次都在刷新。再來演示剛剛轉帳的示例

ajax中如何設置csrf_token

# 第一種頁面上先寫一個{%csrf_token%}標籤,後面用jquery查找標籤取值組成鍵值對放入data中便可

csrf_token局部使用

# 只想給某個視圖韓式加上csrf校驗
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# 局部禁用
@csrf_exempt
def index(request):
  pass

# 局部使用
@csrf_protect
def login(request):
  pass

# CBV比較特殊,不能單獨加在某個方法上
# 只能加在類上或dispatch方法上
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@method_decorator(csrf_exempt,name='get')  # 第一種
class Csrf_Token(View):
  @method_decorator(csrf_exempt)  # 第二種
  def dispatch(self,request,*args,**kwargs):
    res = super().dispatch(request,*args,**kwargs)
    return res
  @method_decorator(csrf_exempt)  # 這裏這麼寫不行!!!
  def get(self,request):
    pass
  def post(self,request):
    pass
相關文章
相關標籤/搜索