首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在models.py中访问请求

如何在models.py中访问请求
EN

Stack Overflow用户
提问于 2021-11-09 09:36:33
回答 1查看 65关注 0票数 0
代码语言:javascript
运行
复制
@property
def get_maca(self, request):
    if  request.user.name == "example":
       return self

我想做这样的事情。如果用户名是example,则返回该对象。

如何像这样访问请求?

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 12:11:59

标准方法是将请求从视图/路由器一直传递到模型,或者在您的情况下仅传递用户对象。

这在较大的项目中很快就会失控,所以我的方法是使用线程本地来保存一些我希望在整个项目中可用的请求上下文。线程本地存储将保持数据在单个线程内可用,而不会被其他线程访问-如果您要在生产服务器上运行Django应用程序,这将是非常棒的。

从本地存储开始:

代码语言:javascript
运行
复制
from threading import local
_active_user = local()

def activate_user(user):
    if not user:
        return

    _active_user.value = user

def deactivate_user():
    if hasattr(_active_user, "value"):
        del _active_user.value

def get_user():
    """Returns `(is_anonymous, user)` ."""
    active_user = getattr(_active_user, "value", None)
    if active_user and active_user is not AnonymousUser:
        try:
            return False, active_user
        except AttributeError:
            pass

    return True, None

现在一切都好了,您可以手动使用它。调用activate_user将使您能够在项目中的任何位置调用get_user。然而,这很容易出错--如果您忘记调用deactivate_user,user对象将仍然可用于下一个即将到来的请求。

剩下的答案就是展示如何让事情变得自动化。

让我们首先创建一个中间件,在每次请求后调用deactivate_user进行清理。

代码语言:javascript
运行
复制
class ThreadCleanupMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Executed for each request/response after
        # the view is called.
        deactivate_user()

        return response

将指向ThreadCleanupMiddleware的路径添加到settings.MIDDLEWARE列表的末尾。

最后是一个视图混入,它可以自动激活用户(这适用于基于类的视图;如果您使用的是函数视图,那么它将是一个装饰器):

代码语言:javascript
运行
复制
class ContextViewSetMixin:

    def initial(self, request, *args, **kwargs):
        super().initial(request, *args, **kwargs)
        if request.user.is_authenticated:
            activate_user(request.user)

class ContextModelViewSet(ContextViewSetMixin, viewsets.ModelViewSet):
    pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69895801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档