Django框架之中介軟體與Auth
阿新 • • 發佈:2018-11-26
Django框架之中介軟體與Auth模組
一 cbv加裝飾器
-先匯入:from django.utils.decorators import method_decorator
-1 可以在方法上加裝飾器:
@method_decorator(login_auth)
-2 可以在類上加
@method_decorator(login_auth,name='post')
@method_decorator(login_auth,name='get')
-3 可以加在dishpatch方法上
@method_decorator(login_auth)
一旦加在dishpatch,說明,所有方法都加了裝飾器
二 中介軟體
-中介軟體是什麼?請求和響應之間的一道屏障
-中介軟體作用:控制請求和響應
-django中內建幾個中介軟體
-自定義中介軟體
-from django.utils.deprecation import MiddlewareMixin 先匯入
-定義一個類,隨意命名,繼承MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self, request):
print('MyMiddleware---->1---->process_request')
# 返回HttpRspons物件,直接返回,走自己的process_response
# 返回None的時候,繼續往下走
# return HttpResponse('i am middle--1')
return None
def process_response(self, request, response):
print('MyMiddleware--->1---->process_response')
return response
-使用:在setting中註冊,是有順序的,
MIDDLEWARE = [
'app01.mymiddelware.MyMiddleware1',]
-中介軟體執行順序:
-process_request,從上往下執行
-如果retrun HttpResponse的物件,直接返回了
-如果retrun None ,繼續往下走
-process_response,從下往上執行
-必須要retrun Httpresponse的物件
-中介軟體的方法:()
-process_request
-請求來的時候,會響應它
-process_response
-響應回去的時候,會走它
-process_view(瞭解)
- request, callback(檢視函式), callback_args(無名分組的引數), callback_kwargs(有名分組的引數)
-執行順序,詳見圖
-def process_exception(self, request, exception)(瞭解)
-def process_template_response(self, request, response):(瞭解)
三 csrf:跨站請求偽造
比如:轉賬請求:transfer?to=lqz&count=1000
-是什麼?攻擊者盜用了你的身份,以你的名義傳送惡意請求,對伺服器來說這個請求是完全合法的
-如何防範:
-通過refer
-加一個隨機字串校驗(載入請求的路徑裡,載入請求體中)
-在請求頭中加字串校驗
django中的應用:
-中介軟體不註釋掉
-以後再發post請求,攜帶那個隨機字串
-form表單形式:
<form action="" method="post">
{% csrf_token %}
<input type="text" name="name">
<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
-ajax提交
data: {
'name': $('[name="name"]').val(),
'pwd': $('[name="pwd"]').val(),
//'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
'csrfmiddlewaretoken': '{{ csrf_token }}'
},
csrf:區域性禁用,區域性使用
-用裝飾器:from django.views.decorators.csrf import csrf_exempt,csrf_protect
-fbv--->直接載入fbv上就行了
-區域性禁用,全域性得使用
@csrf_exempt
def csrf_disable(request):
print(request.POST)
return HttpResponse('ok')
-區域性使用,全域性得禁用
@csrf_protect
def csrf_disable(request):
print(request.POST)
return HttpResponse('ok')
-cbv-->只能加在dispatch方法或者類上面
-區域性禁用,全域性得使用
-區域性使用,全域性得禁用
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect,name='dispatch')
class Csrf_disable(View):
# @method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
ret=super().dispatch(request, *args, **kwargs)
return ret
def get(self,request):
return HttpResponse('ok') def post(self,request):
return HttpResponse('post---ok')
四 auth元件
-auth是什麼?
-django內建的使用者認證系統,可以快速的實現,登入,登出,修改密碼....
-怎麼用?
-(1)先建立超級使用者:
-python3 manage.py createsuperuser
-輸入使用者名稱,郵箱(可以不輸入),密碼,敲回車,這樣就創建出一個超級使用者
-也就是在auth_user這個表中插入了一條資料(密碼是加密的,所以我不能手動插入)
-(2)驗證使用者:
-from django.contrib import auth
-user = auth.authenticate(request, username=name, password=pwd)
-相當於在查詢:user=models.User.objects.filter(name=name,pwd=pwd).first()
-如果校驗通過,會返回一個user物件,通過判斷user物件,校驗是否驗證成功
-(3)登入
-auth.login(request,user)
-其實就是在session中寫了一條資料
-(4)一旦登入成功,調了這個函式login(request,user)
-以後再檢視類,函式中的request物件中,就有一個user物件,就是當前登入的使用者物件
-如果沒有登入,request.user=AnonymousUser,匿名使用者
-(5)登出
-auth.logout(request)
-內部:呼叫了request.session.flush(),刪除了登入狀態
-(6)登入認證裝飾器
-from django.contrib.auth.decorators import login_required
[email protected]_required(redirect_field_name='eee',login_url='/login/')
-redirect_field_name:修改?後面的key值,
-login_url:如果沒有登入,跳轉到的頁面
-可以區域性配置
-可以全域性配置(在setting中)
# 全域性的配置,如果沒有登入,跳到這個路由
LOGIN_URL='/login/'
-(7)建立使用者:
-from django.contrib.auth.models import User
- 建立超級使用者和普通使用者
# 不能用create
# user=User.objects.create(username=name,password=pwd)
# 建立超級使用者
# user=User.objects.create_superuser(username=name,password=pwd)
# 建立普通使用者
user=User.objects.create_user(username=name,password=pwd)
-(8)校驗密碼
-request.user.check_password(pwd)
-先拿到使用者(可以是登入使用者,可以現查)
-(9)修改密碼:
-user.set_password(pwd)
-user.save()
-注意:一定要呼叫save(),否則是不儲存的
-(10)is_authenticated()
-如果通過驗證,是true反之false
-(11)其他方法(瞭解):
-is_active:禁止登入網站(使用者還存在,封號)
-is_staff:是否對網站有管理許可權(能不能登入admin)
-(12)刪除使用者
-orm刪除
如果想在認證元件上加手機號等其他欄位:如何處理
-(1) 定義一個表模型,跟User一對一管理
class UserDetail(models.Model):
phone=models.CharField(max_length=32)
# 一對一跟auth_user表做關聯
# 如果是從外部引入的表模型,是不能加引號的
# 如果加引號,只是在當前model找
user=models.OneToOneField(to=User)
-(2)定義一個表模型,繼承(AbstractUser)
-from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# username,password...都有
phone=models.CharField(max_length=32)
sex=models.BooleanField()
-在setting中配置:
AUTH_USER_MODEL ='app01.UserInfo'
-做資料庫遷移,以後就沒有auth_user這個表了,以後認證元件用的表就是UserInfo
-原來auth中的其他操作:
-authentication
-login
-logout
-set_password
....
---一樣用,完全一樣
-不一樣的地方:
如果之前用到User這個表模型的地方,都換成UserInfo
部落格專案:
1 需求分析
-首頁(顯示文章)
-文章詳情
-點贊,點踩
-文章評論
-字評論
-評論的展示
-登入功能(圖片驗證碼)
-註冊功能(基於form驗證,ajax)
-個人站點(不同人不同樣式,文章過濾)
-後臺管理:
-文章展示
-新增文章
-富文字編輯器
2 設計程式(框架,資料庫設計)
-UserInfo----使用者表
-blog-----個人站點表
-Article----文章表
-commit----評論表
-upanddown----點贊點踩表
-category---文章分類表
-tag---文章標籤表
-表關係
-userInfo跟blog ---- 一對一
-article跟blog-----一對多
-article跟category----(一篇文章只能由一個分類,一個分類下有多篇文章)一對多
-article跟tag----(一個標籤可以對應多篇文章,一篇文章可以有多個標籤)多對多
-commit跟Article---- 一對多
-upanddown跟Article---- 一對多
-user跟commit---一對多
-user跟upanddown---一對多
-category跟blog----一對多
-tag跟blog----一對多
3 分任務開發(git)
4 測試
一 cbv加裝飾器
-先匯入:from django.utils.decorators import method_decorator
-1 可以在方法上加裝飾器:
@method_decorator(login_auth)
-2 可以在類上加
@method_decorator(login_auth,name='post')
@method_decorator(login_auth,name='get')
-3 可以加在dishpatch方法上
@method_decorator(login_auth)
一旦加在dishpatch,說明,所有方法都加了裝飾器
二 中介軟體
-中介軟體是什麼?請求和響應之間的一道屏障
-中介軟體作用:控制請求和響應
-django中內建幾個中介軟體
-自定義中介軟體
-from django.utils.deprecation import MiddlewareMixin 先匯入
-定義一個類,隨意命名,繼承MiddlewareMixin
class MyMiddleware1(MiddlewareMixin):
def process_request(self, request):
print('MyMiddleware---->1---->process_request')
# 返回HttpRspons物件,直接返回,走自己的process_response
# 返回None的時候,繼續往下走
# return HttpResponse('i am middle--1')
return None
def process_response(self, request, response):
print('MyMiddleware--->1---->process_response')
return response
-使用:在setting中註冊,是有順序的,
MIDDLEWARE = [
'app01.mymiddelware.MyMiddleware1',]
-中介軟體執行順序:
-process_request,從上往下執行
-如果retrun HttpResponse的物件,直接返回了
-如果retrun None ,繼續往下走
-process_response,從下往上執行
-必須要retrun Httpresponse的物件
-中介軟體的方法:()
-process_request
-請求來的時候,會響應它
-process_response
-響應回去的時候,會走它
-process_view(瞭解)
- request, callback(檢視函式), callback_args(無名分組的引數), callback_kwargs(有名分組的引數)
-執行順序,詳見圖
-def process_exception(self, request, exception)(瞭解)
-def process_template_response(self, request, response):(瞭解)
三 csrf:跨站請求偽造
比如:轉賬請求:transfer?to=lqz&count=1000
-是什麼?攻擊者盜用了你的身份,以你的名義傳送惡意請求,對伺服器來說這個請求是完全合法的
-如何防範:
-通過refer
-加一個隨機字串校驗(載入請求的路徑裡,載入請求體中)
-在請求頭中加字串校驗
django中的應用:
-中介軟體不註釋掉
-以後再發post請求,攜帶那個隨機字串
-form表單形式:
<form action="" method="post">
{% csrf_token %}
<input type="text" name="name">
<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
-ajax提交
data: {
'name': $('[name="name"]').val(),
'pwd': $('[name="pwd"]').val(),
//'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
'csrfmiddlewaretoken': '{{ csrf_token }}'
},
csrf:區域性禁用,區域性使用
-用裝飾器:from django.views.decorators.csrf import csrf_exempt,csrf_protect
-fbv--->直接載入fbv上就行了
-區域性禁用,全域性得使用
@csrf_exempt
def csrf_disable(request):
print(request.POST)
return HttpResponse('ok')
-區域性使用,全域性得禁用
@csrf_protect
def csrf_disable(request):
print(request.POST)
return HttpResponse('ok')
-cbv-->只能加在dispatch方法或者類上面
-區域性禁用,全域性得使用
-區域性使用,全域性得禁用
from django.views import View
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect,name='dispatch')
class Csrf_disable(View):
# @method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
ret=super().dispatch(request, *args, **kwargs)
return ret
def get(self,request):
return HttpResponse('ok') def post(self,request):
return HttpResponse('post---ok')
四 auth元件
-auth是什麼?
-django內建的使用者認證系統,可以快速的實現,登入,登出,修改密碼....
-怎麼用?
-(1)先建立超級使用者:
-python3 manage.py createsuperuser
-輸入使用者名稱,郵箱(可以不輸入),密碼,敲回車,這樣就創建出一個超級使用者
-也就是在auth_user這個表中插入了一條資料(密碼是加密的,所以我不能手動插入)
-(2)驗證使用者:
-from django.contrib import auth
-user = auth.authenticate(request, username=name, password=pwd)
-相當於在查詢:user=models.User.objects.filter(name=name,pwd=pwd).first()
-如果校驗通過,會返回一個user物件,通過判斷user物件,校驗是否驗證成功
-(3)登入
-auth.login(request,user)
-其實就是在session中寫了一條資料
-(4)一旦登入成功,調了這個函式login(request,user)
-以後再檢視類,函式中的request物件中,就有一個user物件,就是當前登入的使用者物件
-如果沒有登入,request.user=AnonymousUser,匿名使用者
-(5)登出
-auth.logout(request)
-內部:呼叫了request.session.flush(),刪除了登入狀態
-(6)登入認證裝飾器
-from django.contrib.auth.decorators import login_required
-redirect_field_name:修改?後面的key值,
-login_url:如果沒有登入,跳轉到的頁面
-可以區域性配置
-可以全域性配置(在setting中)
# 全域性的配置,如果沒有登入,跳到這個路由
LOGIN_URL='/login/'
-(7)建立使用者:
-from django.contrib.auth.models import User
- 建立超級使用者和普通使用者
# 不能用create
# user=User.objects.create(username=name,password=pwd)
# 建立超級使用者
# user=User.objects.create_superuser(username=name,password=pwd)
# 建立普通使用者
user=User.objects.create_user(username=name,password=pwd)
-(8)校驗密碼
-request.user.check_password(pwd)
-先拿到使用者(可以是登入使用者,可以現查)
-(9)修改密碼:
-user.set_password(pwd)
-user.save()
-注意:一定要呼叫save(),否則是不儲存的
-(10)is_authenticated()
-如果通過驗證,是true反之false
-(11)其他方法(瞭解):
-is_active:禁止登入網站(使用者還存在,封號)
-is_staff:是否對網站有管理許可權(能不能登入admin)
-(12)刪除使用者
-orm刪除
如果想在認證元件上加手機號等其他欄位:如何處理
-(1) 定義一個表模型,跟User一對一管理
class UserDetail(models.Model):
phone=models.CharField(max_length=32)
# 一對一跟auth_user表做關聯
# 如果是從外部引入的表模型,是不能加引號的
# 如果加引號,只是在當前model找
user=models.OneToOneField(to=User)
-(2)定義一個表模型,繼承(AbstractUser)
-from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
# username,password...都有
phone=models.CharField(max_length=32)
sex=models.BooleanField()
-在setting中配置:
AUTH_USER_MODEL ='app01.UserInfo'
-做資料庫遷移,以後就沒有auth_user這個表了,以後認證元件用的表就是UserInfo
-原來auth中的其他操作:
-authentication
-login
-logout
-set_password
....
---一樣用,完全一樣
-不一樣的地方:
如果之前用到User這個表模型的地方,都換成UserInfo
部落格專案:
1 需求分析
-首頁(顯示文章)
-文章詳情
-點贊,點踩
-文章評論
-字評論
-評論的展示
-登入功能(圖片驗證碼)
-註冊功能(基於form驗證,ajax)
-個人站點(不同人不同樣式,文章過濾)
-後臺管理:
-文章展示
-新增文章
-富文字編輯器
2 設計程式(框架,資料庫設計)
-UserInfo----使用者表
-blog-----個人站點表
-Article----文章表
-commit----評論表
-upanddown----點贊點踩表
-category---文章分類表
-tag---文章標籤表
-表關係
-userInfo跟blog ---- 一對一
-article跟blog-----一對多
-article跟category----(一篇文章只能由一個分類,一個分類下有多篇文章)一對多
-article跟tag----(一個標籤可以對應多篇文章,一篇文章可以有多個標籤)多對多
-commit跟Article---- 一對多
-upanddown跟Article---- 一對多
-user跟commit---一對多
-user跟upanddown---一對多
-category跟blog----一對多
-tag跟blog----一對多
3 分任務開發(git)
4 測試