<p>1)是的,连锁装饰商是有效的,因为其他答案已经指出。好的风格是主观的,但我个人认为它会使你的代码更难被别人阅读。熟悉Django但不熟悉您的应用程序的人在处理代码时需要在头脑中保留额外的上下文。我认为遵守框架约定是非常重要的,这样可以使代码尽可能的可维护。在</p>
<p>2)答案是肯定的,从技术上讲,将不同的参数传递给包装好的函数是可以的,但是请考虑一个简单的代码示例来说明这是如何工作的:</p>
<pre><code>def decorator1(func):
def wrapper1(a1):
a2 = "hello from decorator 1"
func(a1, a2)
return wrapper1
def decorator2(func):
def wrapper2(a1, a2):
a3 = "hello from decorator 2"
func(a1, a2, a3)
return wrapper2
@decorator1
@decorator2
def my_func(a1, a2, a3):
print a1, a2, a3
my_func("who's there?")
# Prints:
# who's there?
# hello from decorator 1
# hello from decorator2
</code></pre>
<p>在我看来,任何读到这篇文章的人都必须是一个脑力劳动者,才能在decorator堆栈的每个级别上保持方法签名的上下文。在</p>
<p>3)我将使用基于类的视图并重写<code>dispatch()</code>方法来设置实例变量,如下所示:</p>
^{pr2}$
<p><code>dispatch</code>方法调用您的<code>get()/post()</code>方法。来自django文档:</p>
<blockquote>
<p>The as_view entry point creates an instance of your class and calls its dispatch() method. dispatch looks at the request to determine whether it is a GET, POST, etc, and relays the request to a matching method if one is defined</p>
</blockquote>
<p>然后可以在<code>get()</code>和/或<code>post()</code>视图方法中访问这些实例变量。这种方法的优点是可以将其提取到基类中,并在任意数量的视图子类中使用它。它在IDE中的可追溯性也要高得多,因为这是标准继承。在</p>
<p>一个<code>get()</code>请求的示例:</p>
<pre><code>class MyView(View):
def get(self, request, id):
print 'requester is {}'.format(self.requester)
</code></pre>