How to inject variable into scope with a decorator?

前端 未结 11 2104
我寻月下人不归
我寻月下人不归 2020-12-04 17:31

[Disclaimer: there may be more pythonic ways of doing what I want to do, but I want to know how python\'s scoping works here]

I\'m trying to find a way to make a dec

11条回答
  •  被撕碎了的回忆
    2020-12-04 18:10

    I have catched problem with solution using globals.

    Context of globals may be overwritten when you have several concurrent requests. I thought that impossible, but it is - after some time I have catched change of context(globals) if request wasn't quick. Better solution is to pass variable using kwargs:

    def is_login(old_fuction):
        def new_function(request, *args, **kwargs):
            secret_token = request.COOKIES.get('secret_token')
            if secret_token:
                items = SomeModel.objects.get(cookie = secret_token)
                if len(items) > 0:
                    item = items[0]
                    kwargs['current_user'] = item
                    return old_fuction(request, *args, **kwargs)
                else:
                    return HttpResponse('error')
            return HttpResponse(status=404)
        return new_function
    
    @is_login  
    def some_func(request, current_user):
        return HttpResponse(current_user.name)
    

    You'll have to add extra parameter to each decorated function.

提交回复
热议问题