Django Rails控制器继承的等价物

Min*_*ing 2 python django django-views

我与Rails一起使用的常见模式是控制器继承.我会将各种共享功能放入一个基本控制器,ApplicationController或者一些更多的域/关注特定的控制器,然后继承这个基本控制器来创建单独的控制器.

以下是我已经完成或已经看到各种Rails应用程序使用控制器继承的一些事情.

  • 存放某些类型的共享代码.
  • 将共享的前/后过滤器应用于请求.可能使用例如修改传入请求,修改传出响应或更改请求流before_filter.常见用例包括身份验证/授权,请求验证和应用状态前置条件检查.
  • 为共享基本模板的部分状态/会话相关部分提供共享呈现上下文,例如,过滤器设置基本模板随后使用的一些实例变量.例如,站点具有共享标头,该标头显示当前用户和会话的某些特定于域的详细信息.

以下是我已经完成或看过各种Django应用程序的一些事情.它们与上面的内容并不完全相符,而且还有一些差距,我不确定如何以干净的方式进行复制.

  • 我已经看到Django应用程序倾向于更多地使用常规Python函数来封装多种代码重用,利用python模块进行代码组织.
  • 在基于函数的Django视图的情况下,实现前置/后置过滤器的一种可能方式是使用有条件地调用底层视图的装饰器.有没有办法避免需要将装饰器显式附加到每个视图?
  • 我真的不知道处理基本模板上下文的好方法.在某些情况下,如果共享组件是相对本地化的,我可以使用自定义模板呈现为自定义模板标记register.inclusion_tag或者其他类似的机制,但如果依赖于上下文的内容不能轻易地分解到单个组件中,这不是一个好的选择.在其他情况下,如果在任何地方使用附加上下文,可以使用中间件将期望状态注入到请求中,但是如果这应该被局部化到例如路线的某个子集,则这不是一个好的选择.但是这些都不像Rails控制器继承那样普遍,特别是,我不知道一个很好的解决方案,可以向基本模板提供额外的模板渲染上下文变量,类似于基本控制器上的实例变量.

在Django中完成上述操作的推荐/惯用方法是什么?当然,Rails和Django有一些哲学和架构上的差异,所以"相当于X"并不是绝对的一对一.尽管如此,我希望能够对如何做这些常用的用例有所了解.

感谢您阅读此文本墙,并提前感谢您的见解!

PS,一个相关的问题和答案,涉及其中一些要点: Django相当于Rails application_controller

Bur*_*lid 5

对于等效的django方法/函数:

存放某些类型的共享代码.

如果在视图中,使用基于类的视图; 因为它们就像普通的类一样,你可以继承它们并扩展它们(称为"mixins" - 因为你混合了你需要的功能).

参考:基于类的视图

将共享的前/后过滤器应用于请求.可能使用例如before_filter修改传入请求,修改传出响应或更改请求流.常见用例包括身份验证/授权,请求验证和应用状态前置条件检查.

有很多方法可以做到这一点; 取决于您希望实现的具体或一般:

  1. 装饰器(用于基于函数和类的视图)
  2. 类继承(对于基于类的视图)
  3. 包装器功能在URL级别(类似于装饰器,但外推到URL映射器).
  4. 中间件(甚至更高级别的抽象).

为共享基本模板的部分状态/会话相关部分提供共享呈现上下文,例如,过滤器设置基本模板随后使用的一些实例变量.例如,站点具有共享标头,该标头显示当前用户和会话的某些特定于域的详细信息.

在django中,模板范围的功能由模板上下文处理器提供 ; 接收请求并返回字典(映射),然后在所有模板中可用.