django - 如何覆盖 Django 通用基础视图的调度方法?
问题描述
如果我编写一个继承自 Django 通用基础视图的类,那么覆盖其调度方法的正确方法是什么?该文档似乎表明它可以被覆盖,但该示例并未准确显示如何执行此操作。
如果我这样做,
class MyView(View):
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
response = dispatch(request, *args, **kwargs)
return HttpResponse('Hello, world!')
姜戈说,
NameError: name 'dispatch' is not defined.
如果我然后将调度语句更改为此,
response = self.dispatch(request, *args, **kwargs)
姜戈说,
RecursionError: maximum recursion depth exceeded
解决方案
该文档似乎表明它可以被覆盖,但该示例并未准确显示如何执行此操作。
您可以覆盖每个方法(除了一些 Python 内置函数等,但这里不相关)。
然而,覆盖dispatch
并不常见,因为dispatch
基本上检查请求的方法(GET、POST、PATCH、PUT、DELETE 等)到相应的方法get
、post
、patch
、put
、delete
等。
所以,正如你所发现的,如果你在方法中调用方法,你会得到一个相互递归的情况。这里会叫,也会叫。所以这将继续相互调用,直到调用堆栈耗尽。dispatch()
get()
dispatch
get
get
dispatch
在某些情况下,视图会覆盖该dispatch
方法,例如这样LogoutView
做 [GitHub]:
class LogoutView(SuccessURLAllowedHostsMixin, TemplateView): # … @method_decorator(never_cache) def dispatch(self, request, *args, **kwargs): auth_logout(request) next_page = self.get_next_page() if next_page: # Redirect to this page until the session has been cleared. return HttpResponseRedirect(next_page) return super().dispatch(request, *args, **kwargs)
在这里,该dispatch
方法将确保logout
为给定用户进行调用。但是该get
方法不会dispatch
再次调用该方法。
推荐阅读
- python - 计算具有不同长度数据点的压缩距离矩阵
- here-api - 如何使用 Here 绘制带有线条的地图?
- tsql - 试图从 SQL 中的表中获取到期日期
- c++ - 如何在 QMainWindow 中的所有 ui 上递归使用 retranslateUi()?
- sql - 我想从最近生效日期的重复值中发送整条记录
- flutter - Flutter 客户端证书认证
- sql - 如何从具有工作日标志的表中选择下一行
- .net - 从解决方案中的另一个项目启动二进制文件
- javascript - DocuSugn eSignature API 是否支持在 HTML 文档中嵌入地图?
- c++ - 为什么我们在 C++20 中需要 auto after function 概念参数?