Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果我在django视图中返回None并在中间件中处理它呢?_Python_Django - Fatal编程技术网

Python 如果我在django视图中返回None并在中间件中处理它呢?

Python 如果我在django视图中返回None并在中间件中处理它呢?,python,django,Python,Django,我们总是在Django视图中返回HttpResponse,但现在我想在中间件中完成这个包。 也就是说,我可以返回dict(或其他内容)或在视图中引发错误,我的中间件将检测到它: 如果返回dict(body),中间件将像{error:None,code:0,body:bodydict}一样打包dict,并使用JSON.dumps获取字符串作为响应内容(例如代码0); 如果引发错误,中间件将字符串化错误,并将其打包为{error:“Some error”,代码:500,主体:[]} 如果视图返回No

我们总是在Django视图中返回HttpResponse,但现在我想在中间件中完成这个包。 也就是说,我可以返回dict(或其他内容)或在视图中引发错误,我的中间件将检测到它: 如果返回dict(body),中间件将像{error:None,code:0,body:bodydict}一样打包dict,并使用JSON.dumps获取字符串作为响应内容(例如代码0); 如果引发错误,中间件将字符串化错误,并将其打包为{error:“Some error”,代码:500,主体:[]}

如果视图返回None,中间件将打包为{error:None,code:0,body:None}

但问题是,django将检测视图的返回。如果返回None,则会记录一个错误:

The view xxxView didn't return an HttpResponse object. It returned None instead.

现在我想删除这个日志。我该怎么办?

认为你能(轻松地)做到这一点的唯一方法是使用一个装饰器,而不是中间件get\u response方法或任何传递到中间件中的东西。我非常希望至少有一个可调用的
render
方法,而且没有大量工作是不可避免的

def jsonify(fn):
    def __inner(*args,**kwargs):
        result = fn(*args,**kwargs)
        return HTTPResponse(json.dumps({"data":result}))

@jsonify
def my_function(request,...):
    return None

认为你能(轻松地)做到这一点的唯一方法是使用一个装饰器,而不是中间件get_response方法或任何传递到中间件中的方法,它非常想要至少有一个可调用的
render
方法的东西,并且没有大量的工作是不可避免的

def jsonify(fn):
    def __inner(*args,**kwargs):
        result = fn(*args,**kwargs)
        return HTTPResponse(json.dumps({"data":result}))

@jsonify
def my_function(request,...):
    return None

实际上,这是我处理所有请求的原始方法;但我认为中间件是一种更简单的方法-只需要添加一行代码,就可以模糊功能。。。django采取了很大的措施来避免这种情况。。。如果你真的想要这个,你应该使用一个不同的框架。大多数轻量级rest框架都支持这一点(flask、falcon、Melted等等),django rest框架中可能有一些基类可以将APIView的所有方法自动封装在类似这样的东西中(可能是这样的),因此,只要您使用django rest framework基于类的视图,也许您就可以做到这一点……实际上,这是我处理所有请求的原始方法;但我认为中间件是一种更简单的方法-只需要添加一行代码,就可以模糊功能。。。django采取了很大的措施来避免这种情况。。。如果你真的想要这个,你应该使用一个不同的框架。大多数轻量级rest框架都支持这一点(flask、falcon、Melted等等),django rest框架中可能有一些基类可以自动将APIView的所有方法封装在类似这样的东西中(可能),所以只要您使用django rest框架基于类的视图,也许您就可以做到这一点。。。