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 '怎么获取用户对象?'

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

原文地址:https://www.cnblogs.com/thescholar/p/12228327.html

时间: 2024-08-29 14:31:02

Django中非视图函数获取用户对象的相关文章

视图函数获取请求头信息

视图函数获取相关信息请求头信息 Django 的request 中封装的了所有的信息,之前我们只是使用了POST,GET的方法来获取数据 查看request类 def index(request): print(type(request)) return HttpResponse('ko') #输出 <class 'django.core.handlers.wsgi.WSGIRequest'> 导入这个类看看有什么方法 def index (request): from django.core

Django之视图函数总结

Django之视图函数总结 HttpRequest与HttpResponse http请求中产生两个核心对象: HttpRequest对象:用户请求相关的所有信息(对象) HttpResponse对象:响应字符串 HttpRequest对象的属性和方法: request.path # 获取访问文件路径 request.method #获取请求中使用的HTTP方式(POST/GET) request.body #含所有请求体信息 是bytes类型 request.GET #GET请求的数据(类字典

Django 定义视图函数

Django 定义视图函数 视图函数主要在Django项目内app下的 views.py 文件内定义 # 调用模块方法 from django.shortcuts import render,HttpResponse,redirect def func() # 包含所有的请求数据 .... # 返回字符串内容 return HttpRespon('字符串') # 返回数据 render(request,'模板路径') 返回html模板内容 return render(request,'index

Django的视图函数中一些没有用过的小点

1.request对象 print("返回用户访问的url,但是不包括域名",request.path_info) print("返回请求的方法,全大写",request.method) print("返回HTTPde GET参数的类的字典对象",request.GET) print("返回HTTPde POST参数的类的字典对象", request.POST) print("请求体",request.bo

django之视图函数

视图函数接收Web请求并返回Web响应. 请求对象 urls.py from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'index/',views.index), re_path(r'^$',views.index) ] views.py from django.shortcuts import render,

django搭建微信后台——获取用户信息(7.20)

略坑啊,啃文档啃得要吐了,pythonanywhere上又不好看问题出在哪又跑到本地各种测试才知道原来要授权,又跑去N久之前弄的测试账号,总之各种坑...不过总算是弄清楚怎么实现的了,参考方倍工作室:微信公众平台开发(76) 获取用户基本信息. 第一步是要从POST过来的XML包里面获取openid,也就是FromUserName.这个在开发包里并没有不知道为啥,或者是我没发现?0.0总之自己写了一小段把这个值取出来了. def get_openid(data): if type(data) =

django之视图函数的介绍

request-path 路径 request.get_full_path() 路径+数据 render(request,"html") 推荐 render_to_response("html") 有时会出现意想不到的bug locals() 局部变量全部传给模板 redirect("路径") 页面跳转 redirect() 跳转 render() 不跳转 原文地址:https://www.cnblogs.com/jintian/p/111355

Django基础三之视图函数

Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

03.Django基础三之视图函数

一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了--可以说"没有什么神奇的地方".为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为view