• Django中非视图函数获取用户对象


    今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象?
    平常我们获取用户对象使用的是:

    request.user
    

    不得不说,这确实很方便。
    但是,如果现在有两个类:

    # 注意,这两个类可以不在同一个py文件中
    
    
    # 视图类
    class Index(View):
        """
        功能集中调用
        """
        def post(self, request):
            return HttpResponse('你好!')
    
    # 工具类
    class IndexUtil:
        def get_user(self)
            return '怎么获取用户对象?'
    

    因为工具类并没有拿到request对象,所以无法利用request.user获取用户对象
    我的第一个想法是利用缓存,但问题是我没有办法将此次请求和此次请求的用户对象相关联,那就可能会导致此次请求拿到的是上次请求的用户对象,所以这个方案直接pass掉。
    之后又谷歌了很多资料,最后找到了一个完美的解决方案:利用线程存储用户对象,当然这需要一个请求对应一个线程。
    下面是具体的代码:

    # 注意,这两个类可以不在同一个py文件中
    
    # 视图类
    from threading import local
    thread = local()
    
    
    class Index(View):
        """
        功能集中调用
        """
        def post(self, request):
            global thread
            thread.user = request.user
            return HttpResponse('你好!')
    
    # 工具类
    class IndexUtil:
        def get_user(self)
            print(thread.user)
            return '怎么获取用户对象?'
    

    注意:如果两个类不再同一个文件中,那么有可能会遇到循环引用的问题。各位可以在我的另一篇博文中找到解决方案。

  • 相关阅读:
    file
    shell脚本的执行
    添加源,删除源
    lsattr, chattr
    umask
    od
    init
    sync
    wc
    history
  • 原文地址:https://www.cnblogs.com/thescholar/p/12228327.html
Copyright © 2020-2023  润新知