django中自定义装饰器

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")

Written by

说点什么

欢迎讨论

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒