首页 > 解决方案 > 使用中间件在每个视图之前调用的自定义装饰器

问题描述

我在一个文件中有一个自定义装饰器,我需要每个 API 都调用这个装饰器。我不想@decorator_name在每个视图之前都写。我认为这可以使用中间件来完成,但我不知道该怎么做。

我试过这样的中间件

class DefaultAccountMiddleware(MiddlewareMixin):

    def process_view(self, request, view_func, view_args, view_kwargs):

        return update_latest_account(view_func)(self, request, *view_args, **view_kwargs)

这是装饰器:

def update_latest_account(f):
@wraps(f)
    def decorator(self, request, *args, **kwargs):

        user_id = request.user.id
        print('hi')
        user = User.objects.filter(id = user_id).first()
        if user is not None:
            account_id = request.META.get("HTTP_ACCOUNT_ID", None)
            user.latest_account_id = account_id
            user.save()
        return f(self, request, *args, **kwargs)
    return decorator

标签: pythondjango

解决方案


推荐阅读