0

私のアプリでは、ログインする必要があるユーザーに応じて 2 つの異なるログイン ページがありますsettings.LOGIN_URL

クラスベースのビューも使用しているため、使用する必要がありますmethod_decorator(login_required)

現時点では、クラス デコレータ (私は Python 2.7 を使用しています) を使用していlogin_urlます。コードはスニペットであり、手で入力されているため、タイプミスがある可能性があります。

login_required_m = method_decorator(login_required)
def requires_role1(view):
  def requires_m(func):
    @wraps(func)
    def wrapper(self, request, *args, **kwargs):
      # I need to process request.user
      if (not ok):
        return redirect(urlresolvers.reverse('some_name'))
      else:
        f = login_required_m(func)
        return f(self, request, *args, **kwargs)
    return wrapper
  view.get = requires_m(view.get)
  view.post = requires_m(view.post)
  return view

本当に気になる行は次のとおりです。

`f = login_required_m(func)`

関数ベースのビューでは、次のように定義できます。

`f = login_required(func, login_url='some_reverse_path')`

しかし、では、パラメーターとしてmethod_decorator(login_required)渡すことができなくなりました。login_url私は 2 つの異なるログイン URL を持っているので、そうする必要があることを覚えておいてください。それらはまったく異なるユーザー名とパスワードのセットを提供します (同じユーザー名が異なるパスワードの両方のセットにあり、異なる人に関連付けられている可能性があります)。

これを達成するために私が何をすべきかについての助けをいただければ幸いです。

編集

受け入れられた答えによると、ここに私が採用した解決策があります:

def login_required_partial(func):
  return partial(login_required, login_url=urlresolvers.reverse('role1_login'))

login_required_m = method_decorator(login_required_partial)

残りのコードは変更せずに残しました。そして、渡されたパラメータがない場合、すべてうまくいくようulr(r'path/(?P<param1>.*)', CBV.as_view(), name='path_name')です。

これを今すぐ修正する良い方法を持っている人はいますか?

4

2 に答える 2

3

これはどうですか:

class MyView(View):

  @method_decorator(lambda x: login_required(x, login_url=reverse_lazy('role1_login')))
  def post(self, request):
    return HttpResponse(status=200)

これは私のために働いているようです。

于 2014-08-14T23:22:02.430 に答える
0

CBV ビュー関数を装飾できます。

# urls.py

from myproj.myapp import views

myview = login_required(views.MyView.as_view(), login_url=None)

urlpatterns = patterns('',
    url('^$', myview),
)

または、ある種の mixin を作成できます。

from django.contrib.auth.decorators import login_required
from functools import partial

class LoginRequiredMixin(object):
    """
    A mixin used for views that can only be accessed by authenticated users.
    """

    login_url = None

    def _login_required(self):
        return partial(login_required, login_url=self.login_url)

    def dispatch(self, request, *args, **kwargs):
        def inner(*args, **kwargs):
            klass = LoginRequiredMixin
            return super(klass, self).dispatch(*args, **kwargs)

        return partial(inner, login_url=self.login_url)(request, *args, **kwargs)

そして、次のように使用します。

 # View class
 class MyView(LoginRequiredMixin, View):
     login_url = lazy_reverse('foo')

     pass

 # Or a view function in urls.py
 myview = views.MyView.as_view(login_url=reverse('foo'))
于 2012-10-24T17:59:49.607 に答える