Хочу полностью закрыть сайт для не авторизованных.. Подскажите что не так?
Django==1.9.6 urls.py
from django.conf.urls import url
from django.contrib import admin
from . import views
from django.contrib.auth.models import User
if User.is_authenticated:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.home_page),
]
else:
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
Ответ
Чтобы "пометить" какой-то url или группу url'ов, как требующие авторизации, можно воспользоваться декоратором:
urls.py
from django.contrib.auth.decorators import login_required
urlpatterns = [
...
url(r"^select2/fields/auto.json$", login_required(AutoResponseView.as_view()), name="django_select2-json"),
...
]
Если хочется закрыть весь сайт от неавторизованных пользователей, то стоит использовать middleware. Например, таким:
middleware.py
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:
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)
Его надо прописать в MIDDLEWARE_CLASSES:
settings.py
MIDDLEWARE_CLASSES = [
...
appname.middleware.LoginRequiredMiddleware,
...
]
Комментариев нет:
Отправить комментарий