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

Django REST framwork的權(quán)限驗(yàn)證實(shí)例

 更新時(shí)間:2020年04月02日 08:38:45   作者:winfred_hua  
這篇文章主要介紹了Django REST framwork的權(quán)限驗(yàn)證實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

在這里插入代碼片# Django REST framwork的權(quán)限驗(yàn)證

一、用戶是否登錄

(1)判斷用戶是否登錄;

permission_classes = (IsAuthenticated, )

注意:permission_classes設(shè)置的是:驗(yàn)證的是用戶是否登錄、用戶是否可以操作該數(shù)據(jù)等的權(quán)限;

權(quán)限組合方式,目前支持:與&(and) 或|(or) 非~(not)

例如:permission_classes = (SecAdminPermission | AudAdminPermission,)

注意:使用元組 (SecAdminPermission | AudAdminPermission,)或列表[ SecAdminPermission | AudAdminPermission]都可以。

(2)設(shè)置用戶認(rèn)證方式;

authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)

注意:authentication_classes設(shè)置的是:用戶可以通過哪種方式登錄系統(tǒng),例如:JWT或傳統(tǒng)的用戶名+密碼方式登錄。

具體代碼如下:

from rest_framework.permissions import IsAuthenticated # 判斷用戶是否登錄
from rest_framework_jwt.authentication import JSONWebTokenAuthentication # jwt用戶認(rèn)證
class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
      mixins.DestroyModelMixin, viewsets.GenericViewSet):
 """
 list:
  獲取用戶收藏列表
 retrieve:
  判斷某個(gè)商品是否已經(jīng)收藏
 create:
  收藏商品
 delete:
  取消收藏
 """
 # 權(quán)限判斷:IsAuthenticated表示是否已經(jīng)登錄,IsOwnerOrReadOnly表示數(shù)據(jù)是不是屬于當(dāng)前登錄用戶
 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
 # 用戶認(rèn)證:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
 authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
 # 定義通過哪個(gè)參數(shù)來定位實(shí)例
 lookup_field = "goods_id" # 在詳細(xì)頁面時(shí),搜索goods_id來確認(rèn)該商品有沒有被收藏,是在當(dāng)前用戶下進(jìn)行搜索的

 def get_queryset(self):
  """獲取當(dāng)前登錄用戶的收藏信息"""
  return UserFav.objects.filter(user=self.request.user)

 # 方法一:修改商品收藏?cái)?shù)
 # def perform_create(self, serializer):
 #  """修改商品收藏?cái)?shù)"""
 #  instance = serializer.save()
 #  goods = instance.goods
 #  goods.fav_num += 1
 #  goods.save()

 # 動態(tài)設(shè)置序列化類
 def get_serializer_class(self):
  if self.action == "list":
   return UserFavDetailSerializer
  elif self.action == "create":
   return UserFavSerializer

  return UserFavSerializer

二、用戶是否對該數(shù)據(jù)有操作權(quán)限;

(1)自定義權(quán)限驗(yàn)證

前提:待驗(yàn)證對象有user字段;

from rest_framework import permissions

# 權(quán)限判斷:數(shù)據(jù)是不是屬于當(dāng)前登錄用戶
class IsOwnerOrReadOnly(permissions.BasePermission):
 """
 Object-level permission to only allow owners of an object to edit it.
 Assumes the model instance has an `owner` attribute.
 """

 def has_object_permission(self, request, view, obj):
  # 1 只讀
  # Read permissions are allowed to any request,
  # so we'll always allow GET, HEAD or OPTIONS requests.
  if request.method in permissions.SAFE_METHODS: # 是不是安全的訪問方法
   return True
 # 2 寫權(quán)限
  # Instance must have an attribute named `owner`.
  # return (obj.publisher if obj.publisher else self.fans )== request.user
  return obj.user== request.user # 判斷當(dāng)前數(shù)據(jù)是不是登錄用戶的數(shù)據(jù)

(2)在接口中,添加數(shù)據(jù)權(quán)限驗(yàn)證;

class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin,
      mixins.DestroyModelMixin, viewsets.GenericViewSet):
 """
 list:
  獲取用戶收藏列表
 retrieve:
  判斷某個(gè)商品是否已經(jīng)收藏
 create:
  收藏商品
  delete:
   取消收藏
 """
 # 權(quán)限判斷:IsAuthenticated表示是否已經(jīng)登錄,IsOwnerOrReadOnly表示數(shù)據(jù)是不是屬于當(dāng)前登錄用戶
 permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
 # 用戶認(rèn)證:方式一:JSONWebTokenAuthentication;方式二:SessionAuthentication
 authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
 # 設(shè)置
 lookup_field = "goods_id" # 在詳細(xì)頁面時(shí),搜索goods_id來確認(rèn)該商品有沒有被收藏,是在當(dāng)前用戶下進(jìn)行搜索的

 def get_queryset(self):
  """獲取當(dāng)前登錄用戶的收藏信息"""
  return UserFav.objects.filter(user=self.request.user)

補(bǔ)充知識:django rest framework api授權(quán)與認(rèn)證

djangorestf 官方文檔 授權(quán)與認(rèn)證教程

permissions.py

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
  '''
  常規(guī)的授權(quán)是 只有擁有者才能編輯它
  '''

  def has_object_permission(self, request, view, obj):
    # 讀權(quán)限 向所有請求開放
    # 所以我們總是允許get, head or options requests.
    if request.method in permissions.SAFE_METHODS:
      return True

    # 寫權(quán)限 只給擁有者
    return obj.owner == request.user

view.py

'''基于泛型類的視圖'''
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer, UserSerializer
from rest_framework import generics
from snippets.permissions import IsOwnerOrReadOnly
from django.contrib.auth.models import User

class UserList(generics.ListAPIView):
  '''
  User表的列表api視圖 查 增 操作
  '''
  queryset = User.objects.all()
  serializer_class = UserSerializer

class UserDetail(generics.RetrieveDestroyAPIView):
  '''
  User表的詳情api視圖 查 改 刪操作
  '''
  queryset = User.objects.all()
  serializer_class = UserSerializer



class SnippetList(generics.ListCreateAPIView):
  permission_classes = [permissions.IsAuthenticatedOrReadOnly]
  queryset = Snippet.objects.all()
  serializer_class = SnippetSerializer

  def perform_create(self, serializer):
    serializer.save(owner=self.request.user)


class SnippetDetail(generics.RetrieveDestroyAPIView):
  # detail 所有人都能讀,但是只有擁有者可以更改

  # permissions.IsAuthenticatedOrReadOnly 表示沒有認(rèn)證的人有讀的權(quán)限,認(rèn)證的人有所有權(quán)限
  # IsOwnerOrReadOnly 通過了前面的授權(quán)之后,還要通過這個(gè)授權(quán)
  # 當(dāng)所有的授權(quán)都通過的時(shí)候 所有的對象實(shí)例都返回true 表示授權(quán)通過
  permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
  queryset = Snippet.objects.all()
  serializer_class = SnippetSerializer

總結(jié):通過傳遞permission_classes 類變量 傳遞授權(quán)類,

1、請求要進(jìn)行某個(gè)操作的時(shí)候 ->

2、傳遞參數(shù)將授權(quán)類列表中的多個(gè)授權(quán)類實(shí)例化得到實(shí)例化對象->

3、調(diào)用所有授權(quán)實(shí)例對象的has_、permission以及has_object_permission方法 ->

4、所有的返回結(jié)果都為true ->

5、該操作的授權(quán)才通過,數(shù)據(jù)操作向下繼續(xù)進(jìn)行。

以上這篇Django REST framwork的權(quán)限驗(yàn)證實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python注釋和運(yùn)算符詳解

    python注釋和運(yùn)算符詳解

    這篇文章主要為大家介紹了python注釋和運(yùn)算符,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • pytorch環(huán)境配置及安裝圖文詳解(包括anaconda的安裝)

    pytorch環(huán)境配置及安裝圖文詳解(包括anaconda的安裝)

    這篇文章主要介紹了pytorch環(huán)境配置及安裝圖文詳解(包括anaconda的安裝),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 原生python實(shí)現(xiàn)knn分類算法

    原生python實(shí)現(xiàn)knn分類算法

    這篇文章主要介紹了原生python實(shí)現(xiàn)knn分類算法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 一文詳解如何使用Python從字符串中提取數(shù)字

    一文詳解如何使用Python從字符串中提取數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何使用Python從字符串中提取數(shù)字的相關(guān)資料,我們在進(jìn)行數(shù)據(jù)處理時(shí)候,可能想要提取字符串中的數(shù)字進(jìn)行分析,需要的朋友可以參考下
    2023-11-11
  • 解決tensorflow 與keras 混用之坑

    解決tensorflow 與keras 混用之坑

    這篇文章主要介紹了解決tensorflow 與keras 混用之坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python線程池的四種好處總結(jié)

    python線程池的四種好處總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python線程池的四種好處歸納內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • python使用numpy尋找二維數(shù)組的最值及其下標(biāo)方法分析

    python使用numpy尋找二維數(shù)組的最值及其下標(biāo)方法分析

    這篇文章主要為大家介紹了python使用numpy尋找二維數(shù)組的最值及其下標(biāo)實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Pytorch中Softmax和LogSoftmax的使用詳解

    Pytorch中Softmax和LogSoftmax的使用詳解

    這篇文章主要介紹了Pytorch中Softmax和LogSoftmax的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用Python實(shí)現(xiàn)批量發(fā)送個(gè)性化郵件

    使用Python實(shí)現(xiàn)批量發(fā)送個(gè)性化郵件

    在現(xiàn)代工作環(huán)境中,我們經(jīng)常需要向多個(gè)收件人發(fā)送個(gè)性化的郵件,因此本文小編為大家整理了Python實(shí)現(xiàn)批量發(fā)送個(gè)性化郵件的示例代碼,希望對大家有所幫助
    2023-11-11
  • 使用sklearn之LabelEncoder將Label標(biāo)準(zhǔn)化的方法

    使用sklearn之LabelEncoder將Label標(biāo)準(zhǔn)化的方法

    今天小編就為大家分享一篇使用sklearn之LabelEncoder將Label標(biāo)準(zhǔn)化的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論

庄浪县| 四会市| 隆昌县| 金堂县| 剑川县| 麻阳| 额尔古纳市| 五常市| 崇左市| 同德县| 临泽县| 剑川县| 开封市| 长治市| 平罗县| 云梦县| 玉屏| 隆安县| 顺义区| 岳池县| 新竹市| 万宁市| 新化县| 西乌珠穆沁旗| 蕲春县| 剑川县| 鄂托克旗| 永昌县| 邵阳市| 铜川市| 建阳市| 子洲县| 乌苏市| 磴口县| 永兴县| 肥乡县| 三明市| 团风县| 吉隆县| 锡林郭勒盟| 东平县|