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.前面および背面の許可制御
- バックグラウンドユーザーによる各テーブルの操作は、バックグラウンドプロジェクトによって完了します。管理バックグラウンドプロジェクト(Djangoで構築)を直接使用できます。
- 後で、xadminフレームワークを使用してバックグラウンドのユーザー権限管理を行うこともできます
- フロントエンドユーザーの権限管理に対処する方法
- 定義データ・インタフェースのビュークラスの束異なるユーザーがアクセスできるかどうか、ログインビュークラスを、缶の特権に代わって、いない非特権ユーザー権限フロントデスクの3つの認証フレームワークDRFの代わりに
4.組み込みの6つのテーブル
- auth_user:ユーザーテーブル、拡張
- auth_group:ロールテーブル(グループテーブル)
- auth_permission:権限テーブル
- auth_user_groups:ユーザーからロールへの中間テーブル
- auth_group_permissions:権限に対する役割の中間テーブル
- auth_user_user_permissions:ユーザー権限の中間テーブル(このテーブルはオプションですが、より細かい粒度、それで設立されました)
5.追加する方法
方法1
方法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)
3、Djangoキャッシュ
1.Djangoは6つのキャッシュ方法を提供します
- 開発とデバッグ
- 羊
- ファイル
- データベース
- Memcacheキャッシュ(python-memcachedモジュール)
- Memcacheキャッシュ(pylibmcモジュール)
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 %}
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)
注:ここで設定をコメントアウトしますが、キャッシュファイルがなくなったので、追加することをお勧めします。
3.5キャッシュは、カスタムクラス(ピクル)を含むすべてのデータ型をキャッシュできます
4、djangoシグナル
信号は簡単に理解できます。やることがたくさんあると、たいてい面倒です。何をしたのかわかりません。信号は単なる兆候です。何かを始めて、それを終えました。
-
ログとして記録できます
-
信号はミドルウェアよりも柔軟性があります
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 信号的应用场景:
-记录日志(对象创建就写入日志)
-解耦合