<p>有一个非常简单的解决方案来实现您想要的,它并不意味着装饰<code>dispatch</code>方法。必须在方法(get/post)上使用<code>method_decorator</code>,并将<strong>decorator调用(而不是decorator本身)作为参数传递。</p>
<p>在你的情况下是:</p>
<pre><code>from django.utils.decorators import method_decorator
class ProfileView(View):
template_name = 'index.html'
# Return profile of any role (client/employee/admin)
@method_decorator(login_required())
def get(self, request, *args, **kwargs):
...
# Client sign up
# No decorator is needed
def post(self, request):
...
</code></pre>
<p>注意<code>login_required</code>decorator中的parethesis。</p>
<p>您可以传递任何面向函数的decorator,甚至是自定义的decorator。例如:</p>
<pre><code>def white_list_check():
def decorator(func):
def wrapper(request, *args, **kwargs):
ip = request.META.get('REMOTE_ADDR', '0.0.0.0')
if ip in WHITE_LIST:
return func(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return wrapper
return decorator
</code></pre>
<p>然后,再一次:</p>
<pre><code>class YourView(View):
@method_decorator(white_list_check())
def get(self, request):
...
</code></pre>