我正在努力使中间件,改变用户的一些字段的子域等基础上,.

唯一的问题是请求,用户在中间件中总是以匿名用户的身份进入,但在视图中却是正确的用户.我在设置中保留了Django使用的默认身份验证和会话中间件.

这里有一个类似的问题:Django, request.user is always Anonymous User

在使用DRF的同时,有没有办法在中间件中获取request.user呢?我将在这里展示一些示例代码:

class SampleMiddleware(object):

  def process_view(self, request, view_func, view_args, view_kwargs):
    #This will be AnonymousUser.  I need it to be the actual user making the request.
    print (request.user)    

  def process_response(self, request, response):
    return response

使用PROCESS_REQUEST:

class SampleMiddleware(object):

  def process_request(self, request):
    #This will be AnonymousUser.  I need it to be the actual user making the request.
    print (request.user)    

  def process_response(self, request, response):
    return response

推荐答案

通过从请求中获取DRF令牌并加载请求,我解决了这个问题.用户到与该模型关联的用户.

我使用的是默认的Django身份验证和会话中间件,但是DRF似乎使用了一个接一个的令牌身份验证来解析用户(所有请求都是CORS请求,这可能就是原因所在).以下是我更新的中间件类:

from re import sub
from rest_framework.authtoken.models import Token
from core.models import OrganizationRole, Organization, User

class OrganizationMiddleware(object):

  def process_view(self, request, view_func, view_args, view_kwargs):
    header_token = request.META.get('HTTP_AUTHORIZATION', None)
    if header_token is not None:
      try:
        token = sub('Token ', '', request.META.get('HTTP_AUTHORIZATION', None))
        token_obj = Token.objects.get(key = token)
        request.user = token_obj.user
      except Token.DoesNotExist:
        pass
    #This is now the correct user
    print (request.user)

这也可以在PROCESS_VIEW或PROCESS_REQUEST上使用.

希望这能在future 帮助一些人.

Django相关问答推荐

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

其中实际的数据库提取在DRF list()中完成

Django中的登录重定向

Urls.py中路径**kwargs的Django翻译?

如何在uwsgi中创建单个日志(log)文件?

DjangoAdmin与外部数据库的模型无法保存或过滤

从url参数过滤的Django日期范围返回空查询集

NoneType对象没有属性保存Django

AttributeError:模块rest_framework.serializers在 Swagger 中的 Django 中没有属性NullBooleanField

在 Django 模板中呈现标签名称而不是整数字段

Django ORM:获取每个类别的月平均价格

在 Django Admin change_list 视图中更改 list_editable 字段时保存 Django 模型

Django 从 url 保存图像并与 ImageField 连接

为用户添加自定义权限

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

如何在 Django 中测试自定义模板标签?

Table doesn't exist表不存在

用于创建和更新的基于 Django 类的视图

Django模板过滤器(filters)、标签(tags)、simple_tags和inclusion_tags

将 AND 和 OR 与 Q 对象组合的 Django 查询过滤器不返回预期结果