Django rest框架自定义Response中间件 [英] Django rest framework custom Response middleware
问题描述
我将Django Rest Framework与rest_auth(/login,/logout/,/register ...)一起使用我有一个中间件,通常由user_logged_in或user_logged_out信号触发.
I use Django Rest Framework with rest_auth (/login, /logout/, /register...) I have a Middleware, normally triggered by user_logged_in or user_logged_out signals.
在我的中间件中,我想使用Rest框架中的Response对象.
In my Middleware, I want to use Response object from Rest framework.
我的middleware.py
My middleware.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)
我想我通过了条件,但是出现了这个错误:
I suppose that I pass my condition, but I get this error :
The response content must be rendered before it can be accessed
如何在中间件中正确使用API Response对象?
而且我真的不明白什么是:self.get_response = get_response?
How to use correctly the API Response object in a middleware ?
And I don't understand really what is : self.get_response = get_response ?
推荐答案
return Response(request)
不是django可以处理的.ps您正在将请求对象传递给 Response
是什么意思?
return Response(request)
is not something django can handle. Ps you are passing request object to Response
what does that mean?
实际上 Request
和 Response
类与Django不兼容.rest框架将 WSGIRequest
(django的内置对象)与 Request
对象包装在 APIView
中,然后从视图中获取 Response
对象后,通过展开 HttpResponse
对象.因此, Response
对象只能在其余框架视图中使用.您可以在这样的中间件中使用 django.http
中的 JsonResponse
来自django.http的
Actually Request
and Response
classes from rest framework are not compatible with django. rest framework wraps WSGIRequest
(django's builtin) with Request
object in APIView
and after getting Response
object from view, it creates HttpResponse
object by unwrapping it. So Response
object can only be used in rest framework views. You can use JsonResponse
from django.http
in middleware like this
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)
这篇关于Django rest框架自定义Response中间件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!