第二十二章 Django會話與表單驗證

第二十二章 Django會話與表單驗證html

第一課 模板回顧前端

1.基本操做python

def func(req):jquery

return render(req,'index.html',{'val':[1,2,3...]}ajax

 

#index.html數據庫

<h1>{{val.0}}django

2.繼承:一個html頁面只能繼承一個模板瀏覽器

extends 'layout.html'緩存

{{ block xxx}}服務器

...

{{endblock}}

3.組件:

{{include tag.html}}

 

4.自定義函數:

simple_tag:任意參數,不能用於條件。 

filter: 參數限制,不能加空格,能夠用於條件判斷。

 

第二課 session

1.session的原理:

Cookie是保存在用戶客戶端的鍵值對

Session是保存在服務器端的鍵值對

實例:

def login(req):

if req.method=="GET":

return render(req,'login.html')

elif req.method=="POST":

u=req.POST.get('username')

p=req.POST.get('pwd')

if u=='root' and p=='123':

#1.生成隨機字符串

#2.寫到用戶瀏覽器cookie

#3.保存到session

#4.在隨機字符串對應的字典中設置相關內容...

#1/2/3/4合併爲 設置session值

req.session['username']=u

req.session['is_login']=True

if req.POST.get('rmb',None)=='1':

#超時時間,10秒

req.session.set_expiry(10)

return redirect('/index/')

 

else:

return render(req,'login.html')

def index(req):

#session獲取值

if req.session.get('is_login'):

return render(req,'index.html',{'username':req.session['username']})

else:

return HttpResponse('滾')

運行Session以前,須要在命令行輸入:

python manage.py makemigrations

python manage.py migrate

2.session的基本操做:

session獲取值:

req.session['k1']# 會報錯

req.session.get('k1',None) #不會報錯

session設置值:

req.session['k1']='v1'

req.session.setdefault('k1',123)#存在則不設置

session刪除:

del req.session['k1']

session註銷(退出登陸):

後臺views代碼:

def logout(req):

req.session.clear()

return redirect('/login/')

前端代碼:

<a href="/logout">註銷</a>

session設置超時時間:

req.session.set_expiry(10)#10秒

3.session的配置(setting.py):

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,默認修改以後才保存(默認)

 

第三課 CSRF

1.基於form表單的post加CSRF:

前端代碼:

<form action="/fm/" method="post">

{% csrf_token %}

....

<p><input type="submit" value="提交"></p>

</form>

2.給全部Ajax加CSRF的配置:

前端代碼:

<script src="/static/jquery-3.2.1.js"></script>

<script>

$(function () {

$.ajaxSetup({

data: {csrfmiddlewaretoken: '{{ csrf_token }}' }

});

$('#btn').click(function () {

$.ajax({

url:'/login/',

type:'POST',

data:{'user':'root','pwd':'123'},

suceess:function (arg) {

 

}

})

});

$('#btn2').click(function () {

$.ajax({

url:'/login/',

type:'POST',

data:{'user':'root','pwd':'123'},

suceess:function (arg) {

}

})

})

})

</script>

 

第四課 中間件(管道)

1.在項目下創建目錄:Middle 並在目錄下建立py文件:m1.py

m1.py中的代碼:

from django.utils.deprecation import MiddlewareMixin

from django.shortcuts import HttpResponse

class row1(MiddlewareMixin):

def process_request(self,req):

print('路人甲')

# return HttpResponse('一旦process_request有返回值就截住啦!')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中間件1view")

def process_response(self,req,response):

print('路人甲返回')

return response

class row2(MiddlewareMixin):

def process_request(self,req):

print('路人乙')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中間件2view")

def process_response(self,req,response):

print('路人乙返回')

return response

class row3(MiddlewareMixin):

def process_request(self,req):

print('路人丙')

def process_view(self, request, callback, callback_args, callback_kwargs):

print("中間件3view")

def process_response(self,req,response):

print('路人丙返回')

return response

2.在setting.py文件中MIDDLEWARE 列表中加入代碼:

MIDDLEWARE = [

....

'Middle.m1.row1',

'Middle.m1.row2',

'Middle.m1.row3',

]

 

3.views.py中增長函數:

def test(req):

print('路人丁--》沒帶錢。')

return HttpResponse('ok')

4.加入url.py路徑後,訪問路徑,運行輸出:

路人甲

路人乙

路人丙

中間件1view

中間件2view

中間件3view

路人丁--》沒帶錢。

路人丙返回

路人乙返回

路人甲返回

5.執行順序:

1.row1.process_request(self,req)--->row2.process_request(self,req)...

#若是有process_request函數有返回值,則不繼續進行。

2.row1.process_view(self,...)--->row2.process_view(self,...)....

3.views.函數

4.row1.process_response(self,req,response)-->row2.process_response(self,req,response)...

5.若是views.函數 在執行中報錯了,纔會執行的中間件函數:

def process_exception(self,req,exception):

print('錯誤提示信息')

#感受能夠用於設置一個精美的404界面

 

第五課 緩存

1.6種緩存模式:

開發調試(不作任何緩存,只是開啓)

內存

文件

數據庫

Memcache緩存(python-memcached模塊)

Memcache緩存(pylibmc模塊,只是與上面換了個模塊而已)

2.配置:

1.開發調試:

CACHES = {

            'default': {

                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',# 引擎

                'TIMEOUT': 300,           # 緩存超時時間(默認300,None表示永不過時,0表示當即過時)

                'OPTIONS':{

                    'MAX_ENTRIES': 300,   # 最大緩存個數(默認300)

                    'CULL_FREQUENCY': 3,  # 緩存達最大後,剔除緩存比例,即:1/CULL_FREQUENCY(默認3)

                },

                'KEY_PREFIX': '',        # 緩存key的前綴(默認空)

                'VERSION': 1,            # 緩存key的版本(默認1)

                'KEY_FUNCTION' 函數名   # 生成key的函數(默認函數會生成爲:【前綴:版本:key】)

}

}

2.內存:

# 此緩存將內容保存至內存的變量中

# 配置:

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

'LOCATION': 'unique-snowflake',

}

}

 

# 注:其餘配置同開發調試版本

3.文件:

# 此緩存將內容保存至文件

# 配置:

 

CACHES = {

'default': {

'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',

'LOCATION': '/var/tmp/django_cache',

}

}

# 注:其餘配置同開發調試版本

4.5.6.略

3.實例(文件):

1.在項目目錄下創建cache目錄

2.在settings下加入配置代碼:

CACHES={

'default':{

'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',

'LOCATION':os.path.join(BASE_DIR,'cache')

}

}

3.在urls.py下增長路徑:

path('cache/', views.cache),

4.在views.py下:

1.做用於整個函數的緩存,前端只要調用就使用緩存,給函數加裝飾器:

from django.views.decorators.cache import cache_page

@cache_page(10) #對函數進行緩存,10秒鐘失效,只要調用就用緩存

def cache(req):

import time

ctime=time.time()

return render(req,'cache.html',{'ctime':ctime})

2.局部使用緩存(適用範圍更廣一些)只引入模塊,不加裝飾器:

from django.views.decorators.cache import cache_page

def cache(req):

import time

ctime=time.time()

return render(req,'cache.html',{'ctime':ctime})

在前端html文件中:#############最經常使用

{% load cache %}

<html>

....

{% cache 10 c1 %}  #10秒鐘失效

<h1>{{ ctime }}</h1>

{% endcache %}

...

</html>

3.整個全站設置緩存,使用中間件(幾乎沒有應用場景)

第六課 信號(做用於函數內部方法的’裝飾器‘):

第七課 Form組件驗證(用於註冊,比modelform定製性強):

1.templates目錄下新建fm.html文件:

...

<style>

.c1{

background-color: blue;

}

</style>

...

<form action="/fm/" method="post">

{% csrf_token %}

<p>{{ obj.user }}{{ obj.errors.user.0 }}</p>

<p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>

<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>

<p><input type="submit" value="提交"></p>

</form>

...

2.views.py下:

from django.forms import Form

from django.forms import fields

from django.forms import widgets

class FM(Form):

user=fields.CharField(error_messages={'required':'用戶名不能爲空'})

#變量名自動匹配前端傳過來的name值

pwd=fields.CharField(

max_length=12,

min_length=6,

error_messages={'required':'密碼不能爲空','max_length':'密碼長度不能大於12','min_length':'密碼長度不能小於6'},

widget=widgets.PasswordInput(attrs={'class':'c1'})

)

email=fields.EmailField(error_messages={'required':'郵箱不能爲空','invalid':'郵箱格式錯誤!'})

def fm(req):

if req.method=='GET':

obj=FM()

return render(req,'fm.html',{'obj':obj})

elif req.method=='POST':

#獲取用戶全部數據

#每條數據的請求驗證

#成功:獲取全部正確的信息

#失敗:顯示錯誤信息

obj=FM(req.POST)

r1=obj.is_valid()

print(r1)#數據是否符合要求,成功:True 失敗:False

if r1:

print(obj.is_valid())

else:

print(obj.errors)

return render(req,'fm.html',{'obj':obj})

 

第二十二章 Django會話與表單驗證第一課 模板回顧1.基本操做def func(req):return render(req,'index.html',{'val':[1,2,3...]}#index.html<h1>{{val.0}}2.繼承:一個html頁面只能繼承一個模板extends 'layout.html'{{ block xxx}}...{{endblock}}3.組件:{{include tag.html}}4.自定義函數:simple_tag:任意參數,不能用於條件。 filter: 參數限制,不能加空格,能夠用於條件判斷。第二課 session1.session的原理:Cookie是保存在用戶客戶端的鍵值對Session是保存在服務器端的鍵值對實例:def login(req):if req.method=="GET":return render(req,'login.html')elif req.method=="POST":u=req.POST.get('username')p=req.POST.get('pwd')if u=='root' and p=='123':#1.生成隨機字符串#2.寫到用戶瀏覽器cookie#3.保存到session#4.在隨機字符串對應的字典中設置相關內容...#1/2/3/4合併爲 設置session值req.session['username']=ureq.session['is_login']=Trueif req.POST.get('rmb',None)=='1':#超時時間,10秒req.session.set_expiry(10)return redirect('/index/')else:return render(req,'login.html')def index(req):#session獲取值if req.session.get('is_login'):return render(req,'index.html',{'username':req.session['username']})else:return HttpResponse('滾')運行Session以前,須要在命令行輸入:python manage.py makemigrationspython manage.py migrate2.session的基本操做:session獲取值:req.session['k1']# 會報錯req.session.get('k1',None) #不會報錯session設置值:req.session['k1']='v1'req.session.setdefault('k1',123)#存在則不設置session刪除:del req.session['k1']session註銷(退出登陸):後臺views代碼:def logout(req):req.session.clear()return redirect('/login/')前端代碼:<a href="/logout">註銷</a>session設置超時時間:req.session.set_expiry(10)#10秒3.session的配置(setting.py):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,默認修改以後才保存(默認)第三課 CSRF1.基於form表單的post加CSRF:前端代碼:<form action="/fm/" method="post">{% csrf_token %}....<p><input type="submit" value="提交"></p></form>2.給全部Ajax加CSRF的配置:前端代碼:<script src="/static/jquery-3.2.1.js"></script><script>$(function () {$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' }});$('#btn').click(function () {$.ajax({url:'/login/',type:'POST',data:{'user':'root','pwd':'123'},suceess:function (arg) {}})});$('#btn2').click(function () {$.ajax({url:'/login/',type:'POST',data:{'user':'root','pwd':'123'},suceess:function (arg) {}})})})</script>第四課 中間件(管道)1.在項目下創建目錄:Middle 並在目錄下建立py文件:m1.pym1.py中的代碼:from django.utils.deprecation import MiddlewareMixinfrom django.shortcuts import HttpResponseclass row1(MiddlewareMixin):def process_request(self,req):print('路人甲')# return HttpResponse('一旦process_request有返回值就截住啦!')def process_view(self, request, callback, callback_args, callback_kwargs):print("中間件1view")def process_response(self,req,response):print('路人甲返回')return responseclass row2(MiddlewareMixin):def process_request(self,req):print('路人乙')def process_view(self, request, callback, callback_args, callback_kwargs):print("中間件2view")def process_response(self,req,response):print('路人乙返回')return responseclass row3(MiddlewareMixin):def process_request(self,req):print('路人丙')def process_view(self, request, callback, callback_args, callback_kwargs):print("中間件3view")def process_response(self,req,response):print('路人丙返回')return response2.在setting.py文件中MIDDLEWARE 列表中加入代碼:MIDDLEWARE = [....'Middle.m1.row1','Middle.m1.row2','Middle.m1.row3',]3.views.py中增長函數:def test(req):print('路人丁--》沒帶錢。')return HttpResponse('ok')4.加入url.py路徑後,訪問路徑,運行輸出:路人甲路人乙路人丙中間件1view中間件2view中間件3view路人丁--》沒帶錢。路人丙返回路人乙返回路人甲返回5.執行順序:1.row1.process_request(self,req)--->row2.process_request(self,req)...#若是有process_request函數有返回值,則不繼續進行。2.row1.process_view(self,...)--->row2.process_view(self,...)....3.views.函數4.row1.process_response(self,req,response)-->row2.process_response(self,req,response)...5.若是views.函數 在執行中報錯了,纔會執行的中間件函數:def process_exception(self,req,exception):print('錯誤提示信息')#感受能夠用於設置一個精美的404界面第五課 緩存1.6種緩存模式:開發調試(不作任何緩存,只是開啓)內存文件數據庫Memcache緩存(python-memcached模塊)Memcache緩存(pylibmc模塊,只是與上面換了個模塊而已)2.配置:1.開發調試:CACHES = {            'default': {                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',# 引擎                'TIMEOUT': 300,           # 緩存超時時間(默認300,None表示永不過時,0表示當即過時)                'OPTIONS':{                    'MAX_ENTRIES': 300,   # 最大緩存個數(默認300)                    'CULL_FREQUENCY': 3,  # 緩存達最大後,剔除緩存比例,即:1/CULL_FREQUENCY(默認3)                },                'KEY_PREFIX': '',        # 緩存key的前綴(默認空)                'VERSION': 1,            # 緩存key的版本(默認1)                'KEY_FUNCTION' 函數名   # 生成key的函數(默認函數會生成爲:【前綴:版本:key】)}}2.內存:# 此緩存將內容保存至內存的變量中# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}# 注:其餘配置同開發調試版本3.文件:# 此緩存將內容保存至文件# 配置:CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/var/tmp/django_cache',}}# 注:其餘配置同開發調試版本4.5.6.略3.實例(文件):1.在項目目錄下創建cache目錄2.在settings下加入配置代碼:CACHES={'default':{'BACKEND':'django.core.cache.backends.filebased.FileBasedCache','LOCATION':os.path.join(BASE_DIR,'cache')}}3.在urls.py下增長路徑:path('cache/', views.cache),4.在views.py下:1.做用於整個函數的緩存,前端只要調用就使用緩存,給函數加裝飾器:from django.views.decorators.cache import cache_page@cache_page(10) #對函數進行緩存,10秒鐘失效,只要調用就用緩存def cache(req):import timectime=time.time()return render(req,'cache.html',{'ctime':ctime})2.局部使用緩存(適用範圍更廣一些)只引入模塊,不加裝飾器:from django.views.decorators.cache import cache_pagedef cache(req):import timectime=time.time()return render(req,'cache.html',{'ctime':ctime})在前端html文件中:#############最經常使用{% load cache %}<html>....{% cache 10 c1 %}  #10秒鐘失效<h1>{{ ctime }}</h1>{% endcache %}...</html>3.整個全站設置緩存,使用中間件(幾乎沒有應用場景)第六課 信號(做用於函數內部方法的’裝飾器‘):略第七課 Form組件驗證(用於註冊,比modelform定製性強):1.templates目錄下新建fm.html文件:...<style>.c1{background-color: blue;}</style>...<form action="/fm/" method="post">{% csrf_token %}<p>{{ obj.user }}{{ obj.errors.user.0 }}</p><p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p><p>{{ obj.email }}{{ obj.errors.email.0 }}</p><p><input type="submit" value="提交"></p></form>...2.views.py下:from django.forms import Formfrom django.forms import fieldsfrom django.forms import widgetsclass FM(Form):user=fields.CharField(error_messages={'required':'用戶名不能爲空'})#變量名自動匹配前端傳過來的name值pwd=fields.CharField(max_length=12,min_length=6,error_messages={'required':'密碼不能爲空','max_length':'密碼長度不能大於12','min_length':'密碼長度不能小於6'},widget=widgets.PasswordInput(attrs={'class':'c1'}))email=fields.EmailField(error_messages={'required':'郵箱不能爲空','invalid':'郵箱格式錯誤!'})def fm(req):if req.method=='GET':obj=FM()return render(req,'fm.html',{'obj':obj})elif req.method=='POST':#獲取用戶全部數據#每條數據的請求驗證#成功:獲取全部正確的信息#失敗:顯示錯誤信息obj=FM(req.POST)r1=obj.is_valid()print(r1)#數據是否符合要求,成功:True 失敗:Falseif r1:print(obj.is_valid())else:print(obj.errors)return render(req,'fm.html',{'obj':obj})

相關文章
相關標籤/搜索