8

Django(1.5.1) プロジェクトを継承し、ビューを@login_requiredデコレータの背後に配置する必要があります。ここに私が持っているものがありviews.pyます:

私はこのコードのスニペットをここから入手しました。その目的は、誰かが@login_requiredデコレータをclass

class LoginRequiredMixin(object):
    """
    View mixin which verifies that the user has authenticated.

    NOTE:
        This should be the left-most mixin of a view.
    """

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)


class PermissionRequiredMixin(object):
    login_url = settings.LOGIN_URL
    permission_required = None
    raise_exception = False
    redirect_field_name = '/workers/'

    def dispatch(self, request, *args, **kwargs):
        # Verify class settings
        if self.permission_required == None or len(
            self.permission_required.split(".")) != 2:
            raise Error("'PermissionRequiredMixin' requires "
                "'permission_required' attribute to be set.")

        has_permission = request.user.has_perm(self.permission_required)

        if not has_permission:
            if self.raise_exception:
                return HttpResponseForbidden()
            else:
                path = urlquote(request.get_full_path())
                tup = self.login_url, self.redirect_field_name, path
                return HttpResponseRedirect("%s?%s=%s" % tup)

        return super(PermissionRequiredMixin, self).dispatch(
            request, *args, **kwargs)

次に、パーミッションを追加したいビューにこれを適用します。

class RootWorkerView(LoginRequiredMixin, PermissionRequiredMixin, APIView):
    renderer_classes = (WorkersJSONRenderer, JSONRenderer,
                        BrowsableAPIRenderer)

    def get(self, request):
        worker_list = rest_models.WorkerList(request)
        serializer = WorkerListSerializer(worker_list)
        return Response(serializer.data)

以前はそれが唯一のAPIView引数だったので、引数はキャリーオーバーです。これは正しいです?

実行すると、何も得られません。保護したいビューのテンプレートが、ログイン プロンプトなしで表示されます。

からの関連スニペットurls.py:

url(r'^workers/$', views.RootWorkerView.as_view(),
    name='root_worker_view'),

url(r'^login/$', 'django.contrib.auth.views.login',
    {'template_name': 'dashboard/login.html'}),

/login/動作し、正常にログインできるので、それは問題ではありません。

@method_decorator(login_required)私はその仕事をしていないように感じます。何か案は?

4

3 に答える 3

15

urls.py にデコレータを追加できます

from django.contrib.auth.decorators import login_required
 url(r'^workers/$', login_required(views.RootWorkerView.as_view()))

これは私にとってはうまくいきました。

于 2016-11-28T05:44:21.350 に答える