第二十二章 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})