Isa*_*dor 1 django django-middleware django-rest-framework
我使用带有 rest_auth (/login, /logout/, /register...) 的 Django Rest Framework 我有一个中间件,通常由 user_logged_in 或 user_logged_out 信号触发。
在我的中间件中,我想使用 Rest 框架中的 Response 对象。
我的中间件.py
from django.contrib.sessions.models import Session
from django.contrib.auth import logout
from django.contrib.auth.models import AnonymousUser
from rest_framework.response import Response
from rest_framework import status
class OneSessionPerUserMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.user.is_authenticated:
if request.user.session_key != Session.objects.filter(session_key__in = request.user.session_key):
logout(request)
return Response(request)
return self.get_response(request)
Run Code Online (Sandbox Code Playgroud)
我想我通过了我的条件,但我收到了这个错误:
The response content must be rendered before it can be accessed
Run Code Online (Sandbox Code Playgroud)
如何在中间件中正确使用 API Response 对象?
我真的不明白什么是: self.get_response = get_response ?
return Response(request)不是 django 可以处理的。Ps 你传递请求对象是Response什么意思?
实际上Request,Responserest 框架中的类与 django 不兼容。rest 框架WSGIRequest使用Request对象包装(django 的内置),APIView并在Response从视图中获取对象后,HttpResponse通过解包来创建对象。所以Responseobject 只能在 rest 框架视图中使用。您可以像这样在中间件中使用JsonResponsefromdjango.http
from django.http import JsonResponse
if request.user.is_authenticated:
if request.user.session_key != Session.objects.filter(session_key__in = request.user.session_key):
logout(request)
return JsonResponse({'logout': True}) # or whatever data you want to return
return self.get_response(request)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6223 次 |
| 最近记录: |