django中自定义装饰器,一般用于日志采集,权限控制等
1.用于登录后用户角色判断的decorator
创建文件:touch decorators.py
定义:
from django.core.exceptions import PermissionDenied
from simple_decorators.apps.models import Entry
def user_is_entry_author(function):
def wrap(request, *args, **kwargs):
entry = Entry.objects.get(pk=kwargs['entry_id'])
if entry.created_by == request.user:
return function(request, *args, **kwargs)
else:
raise PermissionDenied
wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__
return wrap
使用:
@login_required
@user_is_entry_author
def edit(request, entry_id):
pass
2.自定义django中的singals
singals.py文件
-------------------自定义singal---------------
# coding:utf-8
from django.dispatch import Signal
post_update = Signal(providing_args=["user"])
models.py文件
-----------针对某个model,override其queryset中的update方法-----------
//引入自定义的signal文件
from tools import signals
class MyCustomQuerySet(models.query.QuerySet):
def update(self, **kwargs):
super(MyCustomQuerySet, self).update(**kwargs)
//update被调用时, 发送该singal
signals.post_update.send(sender=self.model, user="xxx")
print("finished!")
class MyCustomManager(models.Manager):
def get_queryset(self):
return MyCustomQuerySet(self.model, using=self._db)
class crontab_ping(models.Model):
name = models.CharField(max_length=64, blank=True, null=True)
objects = MyCustomManager()
callback.py文件:
-------接收signal,触发操作----------
from tools.signals import post_update
@receiver(post_update)
def post_update_callback(sender, **kwargs):
print(kwargs['user'])
print("post_update_success")
说点什么
欢迎讨论