在我的Django应用程序中,我希望跟踪响应是否已成功发送到客户端.我很清楚,在像HTTP这样的无连接协议中,没有"无懈可击"的方法来确保客户端已经收到(并显示)响应,所以这不是任务关键型功能,但我仍然希望在最晚可能的时间做到这一点.响应不会是HTML,因此不可能从客户端(使用Javascript或IMG标记等)进行任何回调.

我能找到的"最新"挂钩是在中间件列表的第一个位置添加一个实现process_response的自定义中间件,但据我所知,这是在构造实际响应并将其发送到客户端之前执行的.在成功发送响应之后,Django中是否有任何钩子/事件来执行代码?

推荐答案

我现在要使用的方法使用HttpResponse的子类:

from django.template import loader
from django.http import HttpResponse

# use custom response class to override HttpResponse.close()
class LogSuccessResponse(HttpResponse):

    def close(self):
        super(LogSuccessResponse, self).close()
        # do whatever you want, this is the last codepoint in request handling
        if self.status_code == 200:
            print('HttpResponse successful: %s' % self.status_code)

# this would be the view definition
def logging_view(request):
    response = LogSuccessResponse('Hello World', mimetype='text/plain')
    return response

通过阅读Django代码,我非常确信HttpResponse.close()是将代码注入请求处理的最新点.我不确定是否确实存在使用此方法比上面提到的方法处理得更好的错误情况,所以我暂时不考虑这个问题.

与lazerScience的答案中提到的其他方法相比,我更喜欢这种方法的原因是,它可以单独在视图中设置,并且不需要安装中间件.另一方面,使用REQUEST_FINISHED信号不允许我访问响应对象.

Django相关问答推荐

使用django直接计算geohash而不创建模型

Django中的Sync_to_Async修饰器、异步视图

Django OneToOneFieldto抽象对象

如何将Django项目连接到容器化的PostgreSQL数据库?

如何使更新记录在 Django 模型中传递信号?

如何从基于类的视图将用户保存在 django 模型中

DecimalField 验证错误,返回不正确的值 Django

Django 如何知道我的数据库的路径?

为什么我的搜索功能返回错误相关字段查找无效:​​类别

Django 独立脚本

何时在 django 中使用 pre_save、save、post_save?

Django - 在模板中显示当前日期和时间

在 Django REST Framework 中找不到资源时如何返回 404

Django:使用 ModelForm 编辑现有数据库条目

Python:获取异常的错误消息

使用 Django 部署 Google Analytics

Django将HttpResponseRedirect返回到带有参数的url

django 我们可以在预取相关模型上 Select 一个字段吗?

如何在 django 中将多张图片上传到博客文章

如何检测 Heroku 的环境?