30日目Xadmin + RBAC + Cache + Signal

30日目Xadmin + RBAC + Cache + Signal

RBACはDjangoに組み込まれており、私は自分で6つのテーブルを作成したので、誰もがバックグラウンド管理にDjangoを使用するのが好きです。

1.PBAC-役割ベースのアクセス制御

1.PBACとは

RBAC:ロールベースのアクセス制御
RBACでは、権限はロールに関連付けられており、ユーザーは適切なロールのメンバーになることでこれらのロールの権限を取得します。これにより、権限の管理が大幅に簡素化されます。このように、経営者は階層的であり、かつ権限はされに割り当てられた役割、および役割がに割り当てられているユーザー。権限のデザインのこの種は非常に明確かつ管理が容易です

2.アプリケーション

RBAC-ロールベースのアクセス制御
Djangoの認証コンポーネントはRBACである認証ルールを使用します

  • 1)人権管理に特化したシステム(CRMシステム)は社内で使用しているため、データ量は10w未満であり、一般的な効率要件はそれほど高くありません。
  • 多数のユーザーがいる従来のプロジェクトは、フォアグラウンドユーザー(3つの主要な認証)とバックグラウンドユーザー(BRACによって管理される)の2つのタイプのユーザーに分けられます。
  • 結論:特別な要件のないDjangoプロジェクトは、Authコンポーネント権限の6つのテーブルを直接使用できます。6つのテーブルをカスタマイズする必要はなく、テーブルの関係を切断する必要もありません。ユーザーテーブルはカスタマイズできます。

3.前面および背面の許可制御

  1. バックグラウンドユーザーによる各テーブルの操作は、バックグラウンドプロジェクトによって完了します。管理バックグラウンドプロジェクト(Djangoで構築)を直接使用できます。
  2. 後で、xadminフレームワークを使用してバックグラウンドのユーザー権限管理を行うこともできます
  3. フロントエンドユーザーの権限管理に対処する方法
    • 定義データ・インタフェースのビュークラスの束異なるユーザーがアクセスできるかどうか、ログインビュークラスをの特権に代わって、いない非特権ユーザー権限フロントデスクの3つの認証フレームワークDRFの代わりに

4.組み込みの6つのテーブル

  • auth_user:ユーザーテーブル、拡張
  • auth_group:ロールテーブル(グループテーブル)
  • auth_permission:権限テーブル
  • auth_user_groups:ユーザーからロールへの中間テーブル
  • auth_group_permissions:権限に対する役割の中間テーブル
  • auth_user_user_permissions:ユーザー権限の中間テーブル(このテーブルはオプションですが、より細かい粒度、それで設立されました)

5.追加する方法

方法1

画像-20201117160117004

方法2

# views.py

from django.contrib.auth.admin import Group


# 这里导入的都是表名大写

def index(request):
    # 和正常的创建方式没有区别
    Group.objects.create(name="歪比歪比")
    
    
# Group源码
class Group(models.Model):
    # 两个字段 以及关系
    name = models.CharField(_('name'), max_length=150, unique=True)
    permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('permissions'),
        blank=True,
    )
    objects = GroupManager()
    class Meta:
        verbose_name = _('group')
        verbose_name_plural = _('groups')
    def __str__(self):
        return self.name
    def natural_key(self):
        return (self.name,)

第二に、Xadminの使用

1 Djangoには管理者が組み込まれています。醜いと思う人もいます。機能は十分に強力ではありません。このグループの人々は、管理者の代わりにxadminと呼ばれるものを作成しました。

1.インストール

次のコマンドを使用して、最新バージョンのxadminをインストールします

区分1.x和2.x
    	-1.x :pip3 install xadmin
        -2.x :pip3 install git+git://github.com/sshwsfc/xadmin.git@django2
               pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2

2.使用する

  • 以下のアプリケーションを設定ファイルに登録します

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    # 把apps目录设置环境变量中的导包路径
    sys.path.append( os.path.join(BASE_DIR,"luffy/apps") )
    
    
    INSTALLED_APPS = [
        ...
        'xadmin',
        'crispy_forms',
        'reversion',
        ...
    ]
    
    # 修改使用中文界面
    LANGUAGE_CODE = 'zh-hans'
    # 时区这边好像不区分大小写 都可以
    TIME_ZONE = 'asia/shanghai'
    
    USE_TZ = False
    
  • ルーティング構成を実行します

    import xadmin
    xadmin.autodiscover()
    from xadmin.plugins import xversion
    xversion.register_models()
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('xadmin/',xadmin.site.urls)
        
    ]
    
  • データ移行を実行します。そうしないと、エラーが報告され、テーブルが見つかりません。

    manage.py makemigrations
    manage.py migrate
    
  • 以前にスーパーユーザーとしてログインしたことがある場合、スーパーユーザーは自動的にログインします

3.美化する

from django.contrib import admin

from app01 import models
from django.contrib.auth.admin import UserAdmin as UAdmin

# Register your models here.
admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.Publish)

import xadmin
from xadmin import views
from app01 import models


class BaseSetting():
    """xadmin的基本配置"""
    enable_themes = True  # 开启主题切换功能
    use_bootswatch = True


class GlobalSettings():
    """xadmin的全局配置"""
    site_title = "这是标题"  # 设置站点标题
    site_footer = "这是尾巴"  # 设置站点的页脚
    # menu_style = "accordion"  # 设置菜单折叠


# 这里的注册方法和默认的不一样,相当于把参数一和参数二关联起来
# 然后执行
xadmin.site.register(views.BaseAdminView, BaseSetting)
xadmin.site.register(views.CommAdminView, GlobalSettings)


class BookClass():
    # 该表展示的字段
    list_display = ['id', 'name', 'price', 'publish']
    # 按照这些字段搜索
    search_fields = ['id', 'name']
    # 按哪些字段过滤
    list_filter = ['is_delete']
    
    # 可以把数据导出成excel,json,xml格式
    list_export = ('xls', 'xml', 'json')
    # list_export设置为None来禁用数据导出功能
    list_export_fields = ('id', 'name', 'price')
    # 内置绘图功能
    data_charts = {
    
    
        "order_amount": {
    
    
            'title': '图书和价格表',
            "x-field": "price",
            "y-field": ('publish',),
            "order": ('id',)
        },
        
    }


xadmin.site.register(models.Book, BookClass)
xadmin.site.register(models.Publish)
xadmin.site.register(models.Author)


画像-20201117164759564

3、Djangoキャッシュ

1.Djangoは6つのキャッシュ方法を提供します

  • 開発とデバッグ
  • ファイル
  • データベース
  • Memcacheキャッシュ(python-memcachedモジュール)
  • Memcacheキャッシュ(pylibmcモジュール)

1342004-20180708105938925-1930173957

2.構成

ファイルキャッシュ(ウェブサイトは比較的小さく、お金がないので、ファイルの形式を使用できます)

    CACHES = {
    
    
     'default': {
    
    
      'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
      'LOCATION': r'E:\cache',        #指定缓存的路径
      'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
      'OPTIONS':{
    
    
       'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }
     }   
}

3.(キャッシュの粒度)を使用します

3.1単一ページキャッシュ

@cache_page(5)  # 设置缓存时间 超过时间重新加载
def index(request):
    ctime = time.time()
    return render(request, 'index.html', {
    
    "time": ctime})

注:ここで設定をコメントアウトしましたが、通常どおり使用できます

3.2ローカルキャッシュ(ページキャッシュ内の特定の場所)

# index.html 中
# 缓存十秒钟 唯一变量名
{
    
    % load cache %}
{
    
    % cache 10 '唯一名 用作标记' %}
    {
    
    {
    
     time }}
{
    
    % endcache %}

画像-20201117191059338

3.3サイトキャッシュ全体(2つのミドルウェア)

# 在setting中配置
#直接copy

‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重写了process_response
    '。。。',
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后,重写了process_requset

# 缓存过期时间
    CACHE_MIDDLEWARE_SECONDS=5

3.4フロントエンドとバックエンドの分離後のキャッシュの使用

from django.core.cache import cache


class BookView(APIView):
    
    def get(self, request, *args, **kwargs):
        cache_data = cache.get('cache_book_list')
        if cache_data:  # 如果有值说明,已经缓存了  直接返回就好了
            print('我已经缓存了!')
            return Response(cache_data)
        else:
            print('我还没缓存')
            books = models.Book.objects.all()
            ser = serializer.BookSerializer(books, many=True)
            # 源码中暂时找不到相关参数使用,可以理解为
            # 缓存标志(通过这个判断是否缓存了)
            # ser.data 缓存的数据
            # 100缓存过期的时间
            cache.set('cache_book_list', ser.data, 100)
            return Response(ser.data)

画像-20201117193220140

注:ここで設定をコメントアウトしますが、キャッシュファイルがなくなったので、追加することをお勧めします。

3.5キャッシュは、カスタムクラス(ピクル)を含むすべてのデータ型をキャッシュできます

4、djangoシグナル

信号は簡単に理解できます。やることがたくさんあると、たいてい面倒です。何をしたのかわかりません。信号は単なる兆候です。何か始めて、それを終えました

1342004-20180708114317159-1449518127

  • ログとして記録できます

  • 信号はミドルウェアよりも柔軟性があります

Djangoの組み込みシグナル

CopyModel signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发

Djangoシグナルの使用

方法1

組み込み信号のインポート

# 请求来了的信号
from django.core.signals import request_started

# 2 创建一个函数
def start_signal(sender, **kwargs):
    print(sender)
    print(kwargs)
    print('请求来了,我被标记了!')


# 3 跟内置信号绑定
request_started.connect(start_signal)

方法2

 from django.core.signals import request_started,request_finished
        from django.dispatch import receiver
        @receiver(request_finished)  # 内置信号pre_save和my_callback函数绑定了
        def my_callback(sender, **kwargs):
            print("请zzou了,走了我")
  4 信号的应用场景:
		-记录日志(对象创建就写入日志)
    	-解耦合

おすすめ

転載: blog.csdn.net/A1L__/article/details/109755363