若是咱們寫API有人能訪問,有人不能訪問,則須要些認證。 如何知道該用戶是否已登入?數據庫
若是用戶登入成功,則給用戶一個隨機字符串,去訪問另外一個頁面。 django
之前寫session的時候,都是把session寫cookie裏面。 後端
那如今咱們能夠把隨機字符串經過返回值的方式給用戶。 api
後端經過查看用戶的url判斷用戶有沒有token值且這個字符串是否正確也要判斷。有則已登入,能夠訪問;沒有則跳回登入頁面。 瀏覽器
用戶登入cookie
1.有些api須要用戶登入才能訪問,有些api不須要用戶登入就能訪問。session
models.pyapp
建立用戶函數
urls.pypost
views.py 用戶登入只有post請求
token用md5加密,並保存或更新到數據庫中。
post請求,運行結果
token就保存到數據庫了 須要從新檢查代碼
token生成成功後,就將新的token返回給用戶。有異常則返回異常。API寫完了。
運行結果
認證
用戶全部訂單app01
1.訂單url
2. views.py訂單視圖
3.運行結果:get請求
4.這個訂單隻有登入成功的時候才能夠看
運行結果
rest_framework認證
5.這段代碼假設post請求也要認證,若是再複製一遍就會很冗餘。django已經幫咱們封裝好了,不用本身寫。
6.自定義一個認證類,本身寫認證規則。
7.認證源碼
8.本身定義認證規則,認證失敗則返回一個異常。
9.注意:必須再寫一個方法,不然還會報錯。
引入該模塊, 加上該方法:先爲空。
查看該模塊源碼
加上該方法:先爲空。
運行結果
用戶信息app
1.假設用戶信息app也要認證,(登入後才能訪問)
自定義的一個認證寫完了以後,app視圖加上就行了。
2.若是有成千上萬個api都須要認證怎麼辦呢
接下來全局認證:不須要每個視圖都本身加上以上代碼,全局配置settings.py。
認證源碼流程圖:
APIView類 第一步class OrderView(APIView):點擊APIView 第二步def dispatch(self, request, *args, **kwargs): 找到self.initial(request, *args, **kwargs),點擊initial 第三步def initial(self, request, *args, **kwargs): 找到self.perform_authentication(request)(進行認證) 點擊perform_authentication 第四步def perform_authentication(self, request): request.user Request類 第五步同上def dispatch(self, request, *args, **kwargs): 找到request = self.initialize_request(request, *args, **kwargs) 點擊initialize_request 第六步def initialize_request(self, request, *args, **kwargs): 找到return Request,點擊Request 第七步class Request(object): 找到 @property def user(self):(獲取認證對象,進行一步步認證) 找到return self._user 第八步仍是@property def user(self):裏面 找到self._authenticate()點擊_authenticate 第九步def _authenticate(self): (循環全部對象,執行認證方法) Authtication自定義認證類(本身寫了認證方法,就用本身的) 第十步def authenticate(self, request): 報錯:(返回元祖(user對象,token對象)) class OrderView(APIView):或class AuthView(APIView):等訂單 第十一步執行各個訂單的def post: 或def get:等方法
源碼配置
1.dispatch
2.封裝Request
3.for循環認證列表
4.默認去全局的配置文件讀
5.若是本身請求函數裏面設置了,就用本身的。沒設置就用配置文件的。
6.將認證寫在配置文件中,不用局部的。
源碼: api_settings表示去配置文件中讀。
讀REST_FRAMEWORK這個key
7.setting.py
8.將認證相關的東西都寫在一個文件中。再引入該文件
settings.py
views.py:視圖文件中只有視圖相關的類。
9.列表裏填你本身寫的認證類的路徑。 view.py裏的全部類都不用加了,默認用session全局的認證。
10.登入不須要認證信息。全局認證,個別不須要認證。 空列表就行
11.運行結果:
訂單接口:
登入接口:
訂單接口:
接下來是匿名用戶登錄問題
Request封裝直接到:
1.讀取全局認證配置
2.進行認證
3.initial > 實現認證self.perform_authentication(request)
4.user
5.獲取認證對象,進行下一步步的認證
往下走
6.若是是匿名用戶,默認叫什麼
setting.py
views.py
urls.py
運行結果
7.源碼設置默認用戶名:
8.設置匿名用戶名
"UNAUTHENTICATED_USER":lambda :"匿名用戶" 若匿名函數沒有參數,直接返回字符串
url請求
運行結果:
9.setting.py:
1.django內置的認證 引入BaseAuthentication
2.BaseAuthentication 下有兩個方法。
3.推薦繼承BaseAuthentication。更規範。
接下來繼續走源碼: BasicAuthentication 基於瀏覽器認證
1.往下走,複製源碼
settings.py
運行結果
3.views.py: 引入BasicAuthentication
4.運行結果
5.看源碼
6.改源碼,先註釋一下2行代碼
不註釋表示容許用戶爲匿名用戶。
7.運行結果:瀏覽器會對用戶名和密碼加密放到url上,而後發給服務端,進行驗證。
8.還原代碼
本章結束