Ant*_*nio 1 django django-class-based-views
我的应用程序中有很多基于类的视图。其中大多数应该只能由经过身份验证的员工用户访问。如何轻松地为大量基于类的视图添加用户检查?
对于标准函数视图,我添加了这样的装饰器:
def only_staff_allowed(fn):
'''decorator'''
def wrapped(request, *args, **kwargs):
if request.user.is_staff:
return fn(request, *args, **kwargs)
else:
return HttpResponseRedirect(reverse('moderator:login'))
return wrapped
@only_staff_allowed
def dashboard(request):
''' now accessible only by staff users '''
return render(request, 'moderator/dashboard.html', {})
Run Code Online (Sandbox Code Playgroud)
我怎样才能做类似于这样的基于类的视图的事情?
class AddressesAddList(ListView):
template_name = 'moderator/addresses/add_list.html'
queryset = Address.objects.filter(need_moderating=True)
paginate_by = 100
Run Code Online (Sandbox Code Playgroud)
我应该添加一些 mixins 还是覆盖一些方法?或者我可以装饰一些东西吗?
实际上,至少有三种方法可以避免装饰dispatch您想要登录的每个视图类的方法。
如果您只有几个这样的视图,您可以在 URLconf 中使用该装饰器,如下所示:
url(r"^protected/$", login_required(ProtectedView.as_view()), name="protected_view"),
Run Code Online (Sandbox Code Playgroud)
或者,如果您有更多的视图需要保护,最好使用LoginRequiredMixinfrom django-braces:
from braces.views import LoginRequiredMixin
class ProtectedView(LoginRequiredMixin, TemplateView):
template_name = 'secret.html'
Run Code Online (Sandbox Code Playgroud)
而且,如果你有很多视图需要保护,你应该使用一个中间件一下子覆盖一堆视图;类似的东西:
class RequireLoginMiddleware(object):
"""Requires login for URLs defined in REQUIRED_URLS setting."""
def __init__(self):
self.urls = tuple([re.compile(url) for url in REQUIRED_URLS])
self.require_login_path = getattr(settings, 'LOGIN_URL', '/accounts/login/')
def process_request(self, request):
if not request.user.is_authenticated() and request.path != self.require_login_path:
for url in self.urls:
if url.match(request.path):
return HttpResponseRedirect(u"{0}?next={1}".format(self.require_login_path, request.path))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3252 次 |
| 最近记录: |