欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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à)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧

在這里插入代碼片# 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ù)來(lái)定位實(shí)例
 lookup_field = "goods_id" # 在詳細(xì)頁(yè)面時(shí),搜索goods_id來(lái)確認(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()

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

  return UserFavSerializer

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

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

前提:待驗(yàn)證對(duì)象有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ì)頁(yè)面時(shí),搜索goods_id來(lái)確認(rèn)該商品有沒有被收藏,是在當(dāng)前用戶下進(jìn)行搜索的

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

補(bǔ)充知識(shí):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)限 向所有請(qǐng)求開放
    # 所以我們總是允許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í)候 所有的對(duì)象實(shí)例都返回true 表示授權(quán)通過
  permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
  queryset = Snippet.objects.all()
  serializer_class = SnippetSerializer

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

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

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

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

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

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

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

相關(guān)文章

  • Python爬蟲實(shí)例——爬取美團(tuán)美食數(shù)據(jù)

    Python爬蟲實(shí)例——爬取美團(tuán)美食數(shù)據(jù)

    這篇文章主要介紹了Python爬蟲如何爬取美團(tuán)美食數(shù)據(jù),文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 快速部署 Scrapy項(xiàng)目scrapyd的詳細(xì)流程

    快速部署 Scrapy項(xiàng)目scrapyd的詳細(xì)流程

    這篇文章主要介紹了快速部署 Scrapy項(xiàng)目scrapyd的詳細(xì)流程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • python分析nignx訪問日志腳本分享

    python分析nignx訪問日志腳本分享

    這篇文章主要介紹了python分析nignx訪問日志腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • 簡(jiǎn)單了解Python字典copy與賦值的區(qū)別

    簡(jiǎn)單了解Python字典copy與賦值的區(qū)別

    這篇文章主要介紹了簡(jiǎn)單了解Python字典copy與賦值區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Pycharm+Flask零基礎(chǔ)項(xiàng)目搭建入門的實(shí)現(xiàn)

    Pycharm+Flask零基礎(chǔ)項(xiàng)目搭建入門的實(shí)現(xiàn)

    本文主要介紹了Pycharm+Flask零基礎(chǔ)項(xiàng)目搭建入門的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 使用python寫一個(gè)自動(dòng)瀏覽文章的腳本實(shí)例

    使用python寫一個(gè)自動(dòng)瀏覽文章的腳本實(shí)例

    今天小編就為大家分享一篇使用python寫一個(gè)自動(dòng)瀏覽文章的腳本實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-12-12
  • django中SMTP發(fā)送郵件配置詳解

    django中SMTP發(fā)送郵件配置詳解

    這篇文章主要介紹了django中SMTP發(fā)送郵件配置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    opencv是一個(gè)很強(qiáng)大的庫(kù),支持多個(gè)編程語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于Python?OpenCV實(shí)現(xiàn)3種濾鏡效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Python同時(shí)迭代多個(gè)序列的方法

    Python同時(shí)迭代多個(gè)序列的方法

    這篇文章主要介紹了Python同時(shí)迭代多個(gè)序列的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • pygame游戲之旅 按鈕上添加文字的方法

    pygame游戲之旅 按鈕上添加文字的方法

    這篇文章主要為大家詳細(xì)介紹了pygame游戲之旅的第11篇,按鈕上添加文字的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評(píng)論