Django rest框架自定义Response中间件 [英] Django rest framework custom Response middleware

查看:162
本文介绍了Django rest框架自定义Response中间件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆