在Django Rest Framework中限制对非api视图的访问

时间:2015-12-06 22:17:35

标签: django authentication django-rest-framework

我使用Django REST Framework构建一个带有REST API后端的网站,并使用djoser中基于令牌的身份验证。

该网站具有可通过管理页面编辑的用户页面(例如<page-url>/admin) 除非您是所有者,否则不应该访问它们。当request.user不可用时,限制访问非API视图的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

有两种简单的方法来限制匿名用户的访问权限:

  1. 只需为视图的非request.user访问添加规则:

    def admin_view(token):
        if not Token.objects.get(token=token):
            return redirect('%s' % (settings.LOGIN_URL))
    
  2. 为您的管理员观点添加装饰器:

    from django.contrib.auth.decorators import login_required
    
    @login_required(login_url='/accounts/login/')
    def admin_view(view):
        ...
    

    在这种情况下,您必须更新基类中的login_required mixin或编辑默认的auth / permissions中间件,但这取决于您的实际身份验证系统的行为。

答案 1 :(得分:0)

我正在使用装饰器来限制匿名用户的访问。

from django.contrib.auth.decorators import login_required

urlpatterns = patterns(
url(r'^page_url/$', login_required(MyView.as_view())),
)

同样对于翻译我修改了TemplateView。您可以创建一个TemplateView类来限制对静态页面的访问。

class TemplateView(TemplateResponseMixin, ContextMixin, View):

    """
    A view that renders a template.  This view will also pass into the context
    any keyword arguments passed by the url conf.
    """
    def get(self, request, **kwargs):
        try:
            current_user = request.user
            if current_user.is_authenticated() and (bool(request.path_info == '/') or bool(request.path_info == '/login/')):
                return HttpResponseRedirect('/dashboard')
            current_language = current_user.language_code
            translation.activate(current_language)
            context = self.get_context_data(**kwargs)
            return self.render_to_response(context)
        except:
            context = self.get_context_data(**kwargs)
            return self.render_to_response(context)