python學習筆記-Day18 -django(第一部分)

路由系統

第一種  一般設置方式

from django.conf.urls import include, url
from django.contrib import admin
from indexPage import views
urlpatterns = [
    url(r'^$', views.indexPage),
    url(r'^reg/$', views.reg),
    url(r'^home/$', views.home),
]


第二種 動態URL

url(r'^dynamic/(\d+)/$', views.dynamic),  
#向dynamic參數傳參數,默認是按順序傳
url(r'^dynamic/(?P<v1>\d+)/(?P<v2>\d+)$', views.dynamic), 
 # v1 v2 是調用的函數的參數


第三種 分級匹配

url(r'^app01/', include("app01.urls")), 
 #app01爲django下的application,需要app01下也配置url.py 
 訪問地址爲 :  http://IP/app01/dynamic


###################################################


中間件

django 處理是一個請求的時候 ,首先需要通過中間件,然後在通過URL方式去調用先關的views。

在中間件這裏我們可以對請求進行過濾和處理,

安裝方法:

project下的middleware目錄下的middle.py 爲我們的中間件。

在項目的setting.py中進行如下設置

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'middleware.middle.xxx',    #這裏就是我們的中間件,上面的是自帶的中間件
)




運行機制:

簡圖如下:

wKioL1bnwjeRR8jQAABoZyVDBhk438.png

數據走向:


藍色: 正常的過程


紅色: 當mid01的process_request 處理請求時如果遇到return語句時 數據的走向


紫色: 當views遇到異常的時候數據的走向


每一箇中間件都有默認的幾個函數,在自定義的時候也需要實現這幾個函數:

django會把 所有的中間件的同名函數 添加進一個列表 (默認有幾個函數,就有幾個列表)

請求進入的時候 django 會依次調用這個列表中的函數,對請求進行處理。

具體的函數 可參考官方文檔


##############################################################


django中的 cookie /session


具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。

Cookies規則

1、Cookies是以字典方式存儲,訪問是隻要訪問Session的鍵就可以得到對應的Value

2、存儲到客戶端

優點:

數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。

缺點:

1、安全性不高:在客戶端機很容易被查看或破解用戶回話信息


1、session是以字典方式存儲,訪問時只要訪問Session的鍵就可以得到對應的Value


2、Session字典中以下劃線開頭的key值是Django內部保留key值。框架只會用很少的幾個下劃線開頭的session變量,除非你知道他們的具體含義,而且願意跟上Django的變化,否則,最好不要用這些下劃線開頭的變量,它們會讓Django攪亂你的應用。

3、不要用一個新對象來替換掉 request.session ,也不要存取其屬性、

4、Session儲存在服務器端,

優點:數據存儲相對比較安全,數據交換方便。

缺點:如果存儲數據多,訪問量大時,比較消耗服務器端資源,導致網站整體性能下降。

使用方法

request.session['IS_LOGIN']                    #設置

request.session.get('IS_LOGIN',False)    #獲取

del  request.session['IS_LOGIN']                #刪除



#############################################################################


django 中的Form

django中的form有兩個作用

    1.用戶提交數據的驗證

    2. 生成html標籤。


用一個例子來說明問題


新建一個項目:myweb

django-admin.py startproject myweb


進入到 myweb 文件夾,新建一個APP: app01 

python manage.py startapp app01


在app01文件夾中新建一個 forms.py 文件

from django import forms
 
class myForm(forms.Form):
    username = forms.IntegerField()
    password = forms.IntegerField()


我們的視圖函數 views.py 中

# coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse
 
# 引入我們創建的表單類
from .forms import myForm
 
def index(request):
    if request.method == 'POST':     # 得到請求方法爲POST的 提交表單請求時
        form = myForm(request.POST)   #  form 包含提交的數據
        if form.is_valid():         # 如果提交的數據合法
            a = form.cleaned_data['a']
            b = form.cleaned_data['b']
            return HttpResponse(str(int(a) + int(b)))
    else:# 當正常訪問時
        form = myForm()
    return render(request, 'index.html', {'form': form})

    

    

對應的模板文件 index.html  (下面的代碼寫到body中)

<form method='post'>
{{ form }}
<input type="submit" value="提交">
</form>


再在 urls.py 中對應寫上這個函數

urlpatterns = patterns('',
    url(r'^$', 'app01.views.index', name='home'),  # 這一行爲添加的URL路由
    url(r'^admin/', include(admin.site.urls)),
)



###################################################################


默認情況下,Ajax請求使用GET方法。如果要使用POST方法,可以設定type參數值。這個選項也會影響data選項中的內容如何發送到服務器。



$.ajax()函數依賴服務器提供的信息來處理返回的數據。如果服務器報告說返回的數據是XML,那麼返回的結果就可以用普通的XML方法或者jQuery的選擇器來遍歷。如果見得到其他類型,比如HTML,則數據就以文本形式來對待。


通過dataType選項還可以指定其他不同數據處理方式。除了單純的XML,還可以指定 html、json、jsonp、script或者text。


其中,text和xml類型返回的數據不會經過處理。數據僅僅簡單的將XMLHttpRequest的responseText或responseHTML屬性傳遞給success回調函數,


'''注意''',我們必須確保網頁服務器報告的MIME類型與我們選擇的dataType所匹配。比如說,XML的話,服務器端就必須聲明 text/xml 或者 application/xml 來獲得一致的結果。


如果指定爲html類型,任何內嵌的JavaScript都會在HTML作爲一個字符串返回之前執行。類似的,指定script類型的話,也會先執行服務器端生成JavaScript,然後再把腳本作爲一個文本數據返回。


如果指定爲json類型,則會把獲取到的數據作爲一個JavaScript對象來解析,並且把構建好的對象作爲結果返回。爲了實現這個目的,他首先嚐試使用JSON.parse()。如果瀏覽器不支持,則使用一個函數來構建。JSON數據是一種能很方便通過JavaScript解析的結構化數據。如果獲取的數據文件存放在遠程服務器上(域名不同,也就是跨域獲取數據),則需要使用jsonp類型。使用這種類型的話,會創建一個查詢字符串參數 callback=? ,這個參數會加在請求的URL後面。服務器端應當在JSON數據前加上回調函數名,以便完成一個有效的JSONP請求。如果要指定回調函數的參數名來取代默認的callback,可以通過設置$.ajax()的jsonp參數。



如果要處理$.ajax()得到的數據,則需要使用回調函數。beforeSend、error、dataFilter、success、complete。


beforeSend 在發送請求之前調用,並且傳入一個XMLHttpRequest作爲參數。

error 在請求出錯時調用。傳入XMLHttpRequest對象,描述錯誤類型的字符串以及一個異常對象(如果有的話)

dataFilter 在請求成功之後調用。傳入返回的數據以及"dataType"參數的值。並且必須返回新的數據(可能是處理過的)傳遞給success回調函數。

success 當請求之後調用。傳入返回後的數據,以及包含成功代碼的字符串。

complete 當請求完成之後調用這個函數,無論成功或失敗。傳入XMLHttpRequest對象,以及一個包含成功或錯誤代碼的字符串。



描述:

保存數據到服務器,成功時顯示信息。

jQuery 代碼:

$.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   success: function(msg){
     alert( "Data Saved: " + msg );
   }
});


function addUser(arg){
    //console.log($(arg).find("#saveUsername").eq(0).val());
    //console.log($(arg).find("#firstPwd").eq(0).val());
    //console.log($(arg).find("#saveGender").eq(0).val());
    $.ajax({
        type:"POST",
        url:"/add/",
        data:{
            "username":$(arg).find("#saveUsername").eq(0).val(),
            "password":$(arg).find("#firstPwd").eq(0).val(),
            "gender":$(arg).find("#saveGender").eq(0).val(),
        },
        success:function(data){

            if(data=="err"){
                console.log(data);
                console.log("123")
                $(arg).find("#saveUsername").eq(0).css("border-color","red")

            }else {
                console.log(data);
                $(arg).modal('toggle');
                window.location.reload();
            }
        }
    });
}


#######################################################################

緩存


Django 是動態網站,一般來說需要實時地生成訪問的網頁,展示給訪問者,這樣,內容可以隨時變化,但是從數據庫讀多次把所需要的數據取出來,要比從內存或者硬盤等一次讀出來 付出的成本大很多。


對於給定的網址,嘗試從緩存中找到網址,如果頁面在緩存中,直接返回緩存的頁面,如果緩存中沒有,一系列操作(比如查數據庫)後,保存生成的頁面內容到緩存系統以供下一次使用,然後返回生成的頁面內容。


緩存設置好了之後,最簡單的應用便是緩存你的整個站點。


你需要添加兩個中間件到MIDDLEWRAE_CLASSES:django.middleware.UpdateCacheMiddleware和django.middleware.cache.FetchFromCacheMiddleware,注意的是,UpdateCache中間件一定要放在第一位,Fetch中間件必須放最後(因爲中間件的順序決定着運行的順序)見下面示例:


MIDDLEWARE_CLASSES = (

    'django.middleware.cache.UpdateCacheMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.middleware.cache.FetchFromCacheMiddleware',

)

然後你需要在項目配置文件中加入下面幾個必須的設置:


CACHE_MIDDLEWARE_ALIAS:用來存儲的緩存別名

CACHE_MIDDLEWARE_SECONDS:每個頁面應該被緩存的秒數

CACHE_MIDDLEWARE_KEY_PREFIX:關鍵的前綴,當多個站點使用同一個配置的時候,這個可以設置可以避免發生衝突;如果你不在乎的話, 你可以是用一個空字符串,建議你別這樣做

如果請求或者響應的頭部允許的時候,緩存中間件會緩存那些200的get或者head的相應頁面。同一個url但是不同查詢參數會被認爲是不同的相應從而被分別緩存。


如果你設置了CACHE_MIDDLEWARE_ANONYMOUS_ONLY爲真,那麼只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的做法,注意確保已經啓用了認證中間件。


緩存中間件希望一個head請求可以被 一個有相同響應頭部的get請求的響應 響應,因爲這樣的話,緩存中間件可以直接用一個get響應返回給一個head請求。


另外,緩存中間件會自動的設置少量的頭部信息給每一個HttpResponse:


當一個新鮮的頁面被請求的時候,會用當前時間打上一個Last_Modified的頭部

會用當前時間加上CACHE_MIDDLEWARE_SECONDS的值設置給Expires頭部

用CACHE_MIDDLEWARE_SECONDS的值給Cache-Control頭部去設置一個頁面的最大年齡(前提是視圖函數沒有設置該項)


每個視圖函數的緩存


一個更加精細的使用緩存框架的方法是緩存單獨一個視圖函數的輸出。django.views.decorators.cache定義了一個cache_page的裝飾器,使用了這個裝飾器的視圖的輸出會被自動緩存。


cache_page(timeout, [cache=cache name], [key_prefix=key prefix])


cache_page只接受一個參數和兩個關鍵字參數,


timeout是緩存時間,以秒爲單位

cache:指定使用你的CACHES設置中的哪一個緩存後端

key_prefix:指定緩存前綴,可以覆蓋在配置文件中CACHE_MIDDLEWARE_KEY_PREFIX的值

@cache_page(60 * 15, key_prefix="site1")

def my_view(request):

在url配置文件中使用緩存裝飾器


和上面的類似,裝飾器的位置發生了變化


from django.views.decorators.cache import cache_page


urlpatterns = ('',

    (r'^foo/(\d{1,2})/$', cache_page(60 * 15)(my_view)),

)




參考鏈接 :http://www.cnblogs.com/wupeiqi


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