1. 程式人生 > >Django框架之中介軟體與Auth

Django框架之中介軟體與Auth

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 測試