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

Django 按組控制權(quán)限類及定義方法詳解

 更新時間:2023年06月21日 15:09:32   作者:alue  
這篇文章主要為大家介紹了Django 按組控制權(quán)限類及定義方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

任務(wù)描述

后端接口,能夠方便的使用角色組權(quán)限控制, 例如

# 基于函數(shù)的控制
@api_view(['GET'])
@permission_groups(['開發(fā)組','測試組'])
def api(request):
    return Response()
# 或者在類中
class SomeViewSet():
    group_names = ['開發(fā)組','測試組']

只要增加一行代碼, 聲明組名稱, 就能夠讓這個接口只對該角色開放權(quán)限.

方法

思路很簡單, 就是仿照 DRF 的權(quán)限控制, 自定義自己的權(quán)限驗證行為即可.

權(quán)限類定義

仿照drf的權(quán)限類 IsAuthenticated 的寫法:

class IsAuthenticated(BasePermission):
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

我們的權(quán)限類,需要一個組名稱的參數(shù), 所以需要用工廠模式, 根據(jù)參數(shù), 動態(tài)生成類.

def sigma_permission():
    class SigmaPermission(BasePermission):
        def __init__(self, group_names: List[GroupName] = None):
            self._sigma_groups = group_names
        def has_permission(self, request, view):
            if request.user.is_anonymous:
                return False
            return set(request.user.groups.all().values_list('name', flat=True)) & set(self._sigma_groups)
    return SigmaPermission
# 能夠接受參數(shù)的權(quán)限類 
SigmaPermissionFactory = sigma_permission()

我們用類似閉包的形式, 構(gòu)建了自己的權(quán)限類 SigmaPermission, 并且能夠接收組名稱列表作為參數(shù), 內(nèi)部方法 has_permission 實現(xiàn)了權(quán)限驗證的工作.

下面, 就要要看看權(quán)限類該怎么使用. 根據(jù)兩種場景, 分別采用裝飾器和基類繼承的方式.

基于函數(shù)的權(quán)限控制

可以參考drf的 permission_classes 裝飾器的寫法

def permission_classes(permission_classes):
    def decorator(func):
        func.permission_classes = permission_classes
        return func
    return decorator

我們定義自己的組權(quán)限裝飾器:

def permission_groups(group_names: List[GroupName]):
    """ 組權(quán)限裝飾器 """
    def decorator(func):
        groups_permission = SigmaPermissionFactory(group_names)
        if hasattr(func, 'permission_classes') and func.permission_classes is not None:
            func.permission_classes = [*func.permission_classes, lambda: groups_permission]
        else:
            func.permission_classes = [lambda: groups_permission]
        return func
    return decorator

注意: 這里注冊 permission_classes 時, 必須要用 lambda 函數(shù)的方式. 這是因為, 我們的類工廠生成 groups_permission 時, 已經(jīng)完成了初始化. 而Python的類只有在初始化時是 callable 的, 一旦初始化完成之后, 就不能再次callable. 而 permission_classes里的元素必須可以 callable , 所以用 lambda 函數(shù)的方式實現(xiàn).

基于類的權(quán)限控制

這個方法就簡單許多, 只用重載 get_permissions 方法就行.

class SigmaViewSet(ModelViewSet):

def get_permissions(self):
    permissions = [permission() for permission in self.permission_classes]
    if hasattr(self, 'group_names '):
        groups_permission = SigmaPermissionFactory(self.group_names )
        permissions.append(groups_permission)
    return permissions

總結(jié)

通過這個案例, 我們能夠?qū)W到工廠函數(shù)/類的callable/lambda 函數(shù)的使用場景.

以上就是Django 按組控制權(quán)限類及定義方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Django 按組控制權(quán)限的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實現(xiàn)新年愿望代碼雨效果

    Python實現(xiàn)新年愿望代碼雨效果

    新的一年又要來了,這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)新年愿望代碼雨的動畫效果。文中的示例代碼講解詳細(xì),感興趣的可以動手嘗試一下
    2023-01-01
  • 詳解使用Python下載文件的幾種方法

    詳解使用Python下載文件的幾種方法

    這篇文章主要介紹了詳解使用Python下載文件的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 利用Pandas實現(xiàn)對數(shù)據(jù)進行移動計算

    利用Pandas實現(xiàn)對數(shù)據(jù)進行移動計算

    這篇文章主要為大家詳細(xì)介紹了如何利用Pandas實現(xiàn)對數(shù)據(jù)進行移動計算,文中的示例代碼講解詳細(xì),對我們了解Pandas有一定幫助,需要的可以參考一下
    2022-07-07
  • 使用NumPy和pandas對CSV文件進行寫操作的實例

    使用NumPy和pandas對CSV文件進行寫操作的實例

    今天小編就為大家分享一篇使用NumPy和pandas對CSV文件進行寫操作的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python開發(fā)中的Nonetype類型詳解

    Python開發(fā)中的Nonetype類型詳解

    這篇文章主要介紹了Python開發(fā)中的Nonetype類型詳解,None有自己的數(shù)據(jù)類型NoneType,你可以將None復(fù)制給任何變量,但是你不能創(chuàng)建其他NoneType對象,需要的朋友可以參考下
    2023-12-12
  • python中with的具體用法

    python中with的具體用法

    本文主要介紹了python中with的基本使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python實現(xiàn)批量修改文件名

    python實現(xiàn)批量修改文件名

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)批量修改文件名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python中eval帶來的潛在風(fēng)險代碼分析

    Python中eval帶來的潛在風(fēng)險代碼分析

    這篇文章主要介紹了Python中eval帶來的潛在風(fēng)險代碼分析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Python時間戳與時間字符串互相轉(zhuǎn)換實例代碼

    Python時間戳與時間字符串互相轉(zhuǎn)換實例代碼

    這篇文章主要介紹了Python時間戳與時間字符串互相轉(zhuǎn)換實例代碼,大家參考使用
    2013-11-11
  • Python matplotlib的使用并自定義colormap的方法

    Python matplotlib的使用并自定義colormap的方法

    今天小編就為大家分享一篇Python matplotlib的使用并自定義colormap的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論