Django 自定义中间件 request.user 总是 AnonymousUser

标签 django django-middleware

我正在使用 Django 2.2DRF

在我的应用程序中,根据用户属性,我需要将 request.user 更改为不同的用户。

class CustomMiddleware:
  def __init__(self, get_response):
     self.get_response = get_response

  def __call__(self, request):
     print(request.user)

     response = self.get_response(request)
     return response

print(request.user) 始终提供 AnonymousUser 对象,但它在 View 中提供经过身份验证的用户。

如何获取中间件中的用户?

中间件层次结构

MIDDLEWARE = [
    'django_hosts.middleware.HostsRequestMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

    'whitenoise.middleware.WhiteNoiseMiddleware',

    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'silk.middleware.SilkyMiddleware',
    'django_hosts.middleware.HostsResponseMiddleware',

    'oauth2_provider.middleware.OAuth2TokenMiddleware',
    'myapp.middleware.CustomMiddleware',
]

最佳答案

通过在 AUTHENTICATION_BACKENDS 列表中使用 oauth2_provider.backends.OAuth2Backend 解决了这个问题。

AUTHENTICATION_BACKENDS = (
    'oauth2_provider.backends.OAuth2Backend',
    # Uncomment following if you want to access the admin
    #'django.contrib.auth.backends.ModelBackend'
    '...',
)

关于Django 自定义中间件 request.user 总是 AnonymousUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60846831/

相关文章:

Django 验证电子邮件外键

Django 2.0 自定义中间件 process_exception Hook 未触发

django - 使用多主机中间件测试 django 页面

Pythonic/djangonic 以秒为单位处理用户超时的方式(如果需要的话,也可以以分钟为单位)

python - Django 如何在不同目录下调用同名模板?

python - Django 上的 Mysql 错误

python - 使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

python - 使用非模型表单的隐藏表单字段

python-3.x - django 不渲染自定义 403 页面,而是显示浏览器默认值

python - Django 在 PermissionDenied 异常引发时打印错误