最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django Rest framework之權(quán)限的實(shí)現(xiàn)示例

 更新時(shí)間:2018年12月17日 08:36:23   作者:蔚藍(lán)的藍(lán)  
這篇文章主要介紹了Django Rest framework之權(quán)限的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一、權(quán)限實(shí)例

在閱讀本文之前請(qǐng)先參考django rest framework 之 認(rèn)證 中關(guān)于 django rest framework 的相關(guān)內(nèi)容及實(shí)例

1、目錄結(jié)構(gòu)

為了更好的管理各個(gè)功能組件,在django rest framework 之 認(rèn)證 中我們說到可以將認(rèn)證類單獨(dú)的拿出來,放到其他目錄下,然后導(dǎo)入到 views.py 文件中,在權(quán)限環(huán)節(jié)我們亦可以這么做,目錄結(jié)構(gòu)就變成這樣

在api這個(gè)app下創(chuàng)建一個(gè)utils包專門用來存放相關(guān)的組件。

2、為模型類添加認(rèn)證字段

我們?cè)趍odels.py中定義了兩個(gè)模型類,分別是

from django.db import models


class UserInfo(models.Model):
  USER_TYPE = (
    (1,'普通用戶'),
    (2,'VIP'),
    (3,'SVIP')
  )

  user_type = models.IntegerField(choices=USER_TYPE, default=1)
  username = models.CharField(max_length=32)
  password = models.CharField(max_length=64)

class UserToken(models.Model):
  user = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
  token = models.CharField(max_length=64)

UserInfo 中通過為用戶添加一個(gè) user_type 字段來保證用戶的身份,是普通用戶,VIP還是SVIP,這樣就可以通過用戶的身份驗(yàn)證不同的權(quán)限。如果想要定義一個(gè)視圖類,這個(gè)類中的邏輯只有超級(jí)用戶才能訪問。

3、具體權(quán)限認(rèn)證

可以再utils中的 permissions.py 中這么寫

# utils/permission.py


class SVIPPremission(object):
  message = "必須是SVIP才能訪問" # 這里的message表示如果不通過權(quán)限的時(shí)候,錯(cuò)誤提示信息

  def has_permission(self,request,view):
    if request.user.user_type != 3:
      return False
    return True


class MyPremission(object):
  # 這個(gè)權(quán)限類表示當(dāng)用戶為SVIP時(shí)不可通過
  def has_permission(self,request,view):
    if request.user.user_type == 3:
      return False
    return True

這里只是判斷用戶的 USER_TYPE 的字段,判斷用戶是否有權(quán)限,也可以添加其他的邏輯進(jìn)行判斷。

4、全局配置

在上一節(jié)的django rest framework 之 認(rèn)證 的認(rèn)證中,將認(rèn)證類放到了 settings.py 文件中,這樣會(huì)作用到視圖中的每一個(gè)視圖類,如果視圖類想要自己進(jìn)行認(rèn)證,只需要重寫 authentication_classes 即可,那么對(duì)于權(quán)限來說我們也可以這么做,

REST_FRAMEWORK = {
  'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.authenticate.FirstAuthenticate', 'api.utils.authenticate.MyAuthenticate'], 
  "UNAUTHENTICATED_USER": None, # 匿名,request.user = None
  "UNAUTHENTICATED_TOKEN": None,# 匿名,request.auth = None
  "DEFAULT_PERMISSION_CLASSES": ['api.utils.permission.MyPermission'], # 表示每一個(gè)視圖類(只要不重寫permission_classes屬性),都需要SVIP的用戶才能訪問。
}

5、視圖

在視圖 view.py 中定義一個(gè)用戶詳情類 UserInfoView 作為測試,這里的視圖和上一節(jié)的django rest framework 之 認(rèn)證 是相接的。

from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from django.views import View
from rest_framework.views import APIView
from rest_framework.request import Request

from .utils import authenticate, permission
from api import models

import json


def md5(user):
  import hashlib
  import time

  # 當(dāng)前時(shí)間,相當(dāng)于生成一個(gè)隨機(jī)的字符串
  ctime = str(time.time())

  # token加密
  m = hashlib.md5(bytes(user, encoding='utf-8'))
  m.update(bytes(ctime, encoding='utf-8'))
  return m.hexdigest()


class AuthView(APIView):
  '''用于用戶登錄驗(yàn)證'''
  authentication_classes = []   #里面為空,代表不需要認(rèn)證
  permission_classes = []     #不里面為空,代表不需要權(quán)限

  def get(self, request, *args, **kwargs):
    ret = {'code': 1000, 'msg': 'success', 'name': '偷偷'}
    ret = json.dumps(ret, ensure_ascii=False)

    return HttpResponse(ret)

  def post(self,request,*args,**kwargs):
    ret = {'code':1000,'msg':None}
    try:
      user = request.POST.get('username')
      pwd = request.POST.get('password')
      print(user, pwd)
      obj = models.UserInfo.objects.filter(username=user,password=pwd).first()
      print(obj.username, obj.password)
      if not obj:
        ret['code'] = 1001
        ret['msg'] = '用戶名或密碼錯(cuò)誤'
      #為用戶創(chuàng)建token
      token = md5(user)
      #存在就更新,不存在就創(chuàng)建
      models.UserToken.objects.update_or_create(user=obj,defaults={'token':token})
      ret['token'] = token
    except Exception as e:
      ret['code'] = 1002
      ret['msg'] = '請(qǐng)求異常'
    return JsonResponse(ret)


ORDER_DICT = {
  1:{
    'name':'apple',
    'price':15
  },
  2:{
    'name':'狗子',
    'price':100
  }
}


class OrderView(APIView):
  # 用戶想要獲取訂單,就要先通過身份認(rèn)證、在全局settings.py 中已經(jīng)配置
  permission_classes = []

  def get(self, request, *args, **kwargs):
    ret = {
      'code': 1024,
      'msg': '訂單獲取成功',
    }
    try:
      ret['data'] = ORDER_DICT
    except Exception as e:
      pass
    return JsonResponse(ret)
  

class UserInfoView(APIView):
  permission_classes = [permission.SVIPPermission]

  def get(self, request, *args, **kwargs):
    print(request.user)
    return HttpResponse('SVIP用戶信息')

這里的 UserInfoView 重寫了 permission_classes 屬性,則不會(huì)再使用 settings.py 中關(guān)于認(rèn)證類的配置。表示只有SVIP才能訪問這個(gè)類的內(nèi)部。

6、路由分發(fā)

在url.py中設(shè)置路由分發(fā)

from django.conf.urls import url

from api.views import AuthView, OrderView, UserInfoView


urlpatterns = [
  url(r'^api/v1/auth/$', AuthView.as_view()),
  url(r'^api/v1/order/$', OrderView.as_view()),
  url(r'^api/v1/info/$', UserInfoView.as_view()),
]

7、請(qǐng)求測試

Postman或者瀏覽器發(fā)送請(qǐng)求,由于我們?cè)?setting.py 中配置了 'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.authenticate.FirstAuthenticate', 'api.utils.authenticate.MyAuthenticate'],

會(huì)對(duì)請(qǐng)求進(jìn)行認(rèn)證,所以要帶這用戶的 token 才能通過,進(jìn)入到權(quán)限組件。

進(jìn)入sqlite數(shù)據(jù)庫,找到對(duì)應(yīng)的注冊(cè)用戶

在數(shù)據(jù)庫中,拿到刷新的用戶的最近一次的token

拿到這個(gè)token發(fā)送請(qǐng)求

請(qǐng)求成功,則說明權(quán)限生效,也可以在將 UserInfoView 改成如下

class UserInfoView(APIView):
  permission_classes = [permission.SVIPPermission]

  def get(self, request, *args, **kwargs):
    print(request.user)
    return HttpResponse('SVIP用戶信息')

在發(fā)送請(qǐng)求,就會(huì)發(fā)現(xiàn)用戶不會(huì)有權(quán)限的提示信息。如下

二、源碼分析

django rest framework 之 認(rèn)證 一樣進(jìn)入, request 的請(qǐng)求流程,進(jìn)入源碼查看具體權(quán)限的操作

1、進(jìn)入dispath()方法

2、進(jìn)入initial()方法

3、進(jìn)入check_permissions()方法

4、權(quán)限類的具體操作

在這里可以看到和認(rèn)證中有類似的操作,獲取所有的權(quán)限類,并且執(zhí)行每一個(gè)權(quán)限類的 has_permission() 方法,而這個(gè)方法具體封裝了我們的判斷權(quán)限操作,但是 has_permission() 方法的返回值需要時(shí) False 或者 True , self.permission_denied(request, message=getattr(permission, 'message', None)) 說明可以在權(quán)限類中重寫 message 屬性,來定義權(quán)限不通過時(shí)候的提示信息。

進(jìn)入 self.get_permissions() 來看一下

4、獲取所有的權(quán)限類

在APIView中有定義默認(rèn)的權(quán)限類,因此也可以通過全局配置的方法配置權(quán)限類。

5、原生的權(quán)限類

像認(rèn)證那樣, django rest framework 中也有權(quán)限類

可以根據(jù)自己的需要調(diào)用。

三、總結(jié)

權(quán)限其實(shí)的流程跟之前的認(rèn)證流程是一樣的,認(rèn)證類封裝到 request 中,然后再調(diào)用認(rèn)證類的方法,不過這里的方法返回值不再是像認(rèn)證組件那樣的直接返回一個(gè)認(rèn)證的對(duì)象,而是返回一個(gè) True 或者 False 值表示認(rèn)證過的對(duì)象是否有某些權(quán)限再進(jìn)行具體操作。

這里注意的是,在自己重寫權(quán)限類的相關(guān)方法,添加自己的邏輯的時(shí)候,返回值需要是一個(gè)布爾值, Flase 或者 True ,表示是否有權(quán)限。也可以通過全局配置和局部配置權(quán)限類。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python利用BeautifulSoup解析Html的方法示例

    Python利用BeautifulSoup解析Html的方法示例

    BeautifulSoup是python的一個(gè)庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于Python利用BeautifulSoup解析Html的方法示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析

    Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析

    這篇文章主要為大家介紹了Tornado源碼分析之HTTP服務(wù)請(qǐng)求解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Python中l(wèi)ogging日志庫實(shí)例詳解

    Python中l(wèi)ogging日志庫實(shí)例詳解

    這篇文章主要介紹了Python常用庫logging日志庫的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用

    探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用

    本文探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用,包括字符串、列表、元組、字典和集合。通過深入了解它們的特性、操作和常見用法,讀者將能夠更好地利用這些數(shù)據(jù)類型解決實(shí)際問題。
    2023-09-09
  • python判斷端口是否打開的實(shí)現(xiàn)代碼

    python判斷端口是否打開的實(shí)現(xiàn)代碼

    python判斷端口是否打開的代碼,有需要的朋友可以參考下
    2013-02-02
  • 利用python繪制笛卡爾直角坐標(biāo)系

    利用python繪制笛卡爾直角坐標(biāo)系

    這篇文章主要介紹了利用python繪制笛卡爾直角坐標(biāo)系,python繪圖主要用到matplotlib繪圖模塊,利用matplotlib模塊畫出上面的正弦函,需要的朋友可以參考一下
    2022-03-03
  • virtualenv介紹及簡明教程

    virtualenv介紹及簡明教程

    這篇文章主要介紹了virtualenv介紹及簡明教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Pytorch加載圖像數(shù)據(jù)集的方法

    Pytorch加載圖像數(shù)據(jù)集的方法

    這篇文章主要介紹了Pytorch加載圖像數(shù)據(jù)集的方法,加載圖像數(shù)據(jù)集(這里以分類為例),通常都需要經(jīng)過兩個(gè)步驟:定義數(shù)據(jù)集和創(chuàng)建Dataloader數(shù)據(jù)加載器,本文通過代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Python獲取任意xml節(jié)點(diǎn)值的方法

    Python獲取任意xml節(jié)點(diǎn)值的方法

    這篇文章主要介紹了Python獲取任意xml節(jié)點(diǎn)值的方法,涉及Python操作XML節(jié)點(diǎn)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 使用pyplot.matshow()函數(shù)添加繪圖標(biāo)題

    使用pyplot.matshow()函數(shù)添加繪圖標(biāo)題

    這篇文章主要介紹了使用pyplot.matshow()函數(shù)添加繪圖標(biāo)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評(píng)論

尼玛县| 迁安市| 大足县| 陕西省| 婺源县| 行唐县| 永嘉县| 遂平县| 洮南市| 黄石市| 库车县| 屏南县| 横峰县| 桐梓县| 炉霍县| 图们市| 赤峰市| 常州市| 梅河口市| 清新县| 呼伦贝尔市| 柞水县| 松阳县| 诏安县| 绥中县| 彭水| 屯昌县| 铅山县| 屯门区| 武安市| 青神县| 育儿| 渝中区| 眉山市| 台湾省| 南通市| 绥宁县| 新民市| 合山市| 会宁县| 永兴县|