26

このでは、アプリケーション レベルのビューのスニペットを提供していますが、「urls.py」ファイルに、テンプレートを含む多数の異なる (およびいくつかの非アプリケーション) エントリがある場合はどうなるでしょうか? この login_required デコレータをそれぞれに適用するにはどうすればよいですか?

(r'^foo/(?P<slug>[-\w]+)/$', 'bugs.views.bug_detail'),
(r'^$', 'django.views.generic.simple.direct_to_template', {'template':'homepage.html'}),
4

10 に答える 10

28

middleware.pyこれをプロジェクトルートのファイルにドロップしました( http://onecreativeblog.com/post/59051248/django-login-required-middlewareから取得)

from django.http import HttpResponseRedirect
from django.conf import settings
from re import compile

EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware:
    """
    Middleware that requires a user to be authenticated to view any page other
    than LOGIN_URL. Exemptions to this requirement can optionally be specified
    in settings via a list of regular expressions in LOGIN_EXEMPT_URLS (which
    you can copy from your urls.py).

    Requires authentication middleware and template context processors to be
    loaded. You'll get an error if they aren't.
    """
    def process_request(self, request):
        assert hasattr(request, 'user'), "The Login Required middleware\
 requires authentication middleware to be installed. Edit your\
 MIDDLEWARE_CLASSES setting to insert\
 'django.contrib.auth.middlware.AuthenticationMiddleware'. If that doesn't\
 work, ensure your TEMPLATE_CONTEXT_PROCESSORS setting includes\
 'django.core.context_processors.auth'."
        if not request.user.is_authenticated():
            path = request.path_info.lstrip('/')
            if not any(m.match(path) for m in EXEMPT_URLS):
                return HttpResponseRedirect(settings.LOGIN_URL)

projectname.middleware.LoginRequiredMiddleware次に、settings.pyのMIDDLEWARE_CLASSESに追加します。

于 2010-07-13T14:54:29.257 に答える
14

後でこれに来た人にとっては、django-strongholdがあなたのユースケースによく合っていることに気付くかもしれません。公開したいURLをホワイトリストに登録し、残りはログインが必要です。

https://github.com/mgrouchy/django-stronghold

于 2013-02-17T08:58:56.310 に答える
9

これは少し短いミドルウェアです。

from django.contrib.auth.decorators import login_required

class LoginRequiredMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if not getattr(view_func, 'login_required', True):
            return None
        return login_required(view_func)(request, *view_args, **view_kwargs)

ログインしなくても表示できる各ビューで、「login_required」を False に設定する必要があります。

関数ビュー:

def someview(request, *args, **kwargs):
    # body of view
someview.login_required = False

クラスベースのビュー:

class SomeView(View):
    login_required = False
    # body of view

#or

class SomeView(View):
    # body of view
someview = SomeView.as_view()
someview.login_required = False

これは、ログインビューについて何かをしなければならないことを意味しますが、とにかく私はいつも自分の認証バックエンドを書くことになります。

于 2013-05-13T13:27:35.487 に答える
2

ミドルウェアを使用します。

http://www.djangobook.com/en/2.0/chapter17/ および http://docs.djangoproject.com/en/1.2/topics/http/middleware/#topics-http-middleware

これは 1.2 でもあまり変わらなかったと思います。

ミドルウェアを使用すると、定義したさまざまな時間/条件ですべてのリクエストを処理するメソッドを持つクラスを作成できます。

たとえば、 process_request(request) はビューの前に起動し、この時点で認証と承認を強制できます。

于 2010-07-09T16:24:23.820 に答える
0

Django ログインが必要なミドルウェア

このコードを middleware.py に入れます:

from django.http import HttpResponseRedirect
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
from re import compile

EXEMPT_URLS = [compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [compile(expr) for expr in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware(MiddlewareMixin):
    def process_request(self, request):
        assert hasattr(request, 'user')
        if not request.user.is_authenticated:
            path = request.path_info.lstrip('/')
            if not any(m.match(path) for m in EXEMPT_URLS):
                return HttpResponseRedirect(settings.LOGIN_URL)

そして、 settings.py で:

LOGIN_URL = '/app_name/login'

LOGIN_EXEMPT_URLS=(
    r'/app_name/login/',
)

MIDDLEWARE_CLASSES = (
    # ...
    'python.path.to.LoginRequiredMiddleware',
)

このように:「app_name.middleware.LoginRequiredMiddleware」

于 2018-02-14T07:00:21.897 に答える