Для одного проекта понадобилось запретить пользователям давать, другим людям, свой логин для входа на сайт. Честно скажу задача максимально тривиальная и пост пишу со стимулом «чтобы было»

В проекте использовалась Django 1.5 и собственная модель пользователя, как ее сделать вы можете прочитать по этой ссылке. Но все можно сделать и на кастомной модели. И так для начала нужно подумать как все это будет работать и мне показалась самой логичной идея держать в бд запись о том залогинен ли пользователь сейчас или нет, а дальше просто проверять статус и если пользователь сейчас на сайте, предложить его разлогинеть и зайти заново. Еще сразу предупреждаю пишу весь код пишу развернуто и без всяких полезных плюшек, просто как наглядный пример.

is_logedin = models.BooleanField(default=False, verbose_name='Сейчас онлайн')

Это и есть основа основ, дальше все решается уже с помощью views. Первое что я опишу это регистрация для этого создадим функцию register в нашем views.py

from project.account.forms import UserCreationForm
from django.contrib.auth import auth_login, authenticate

def register(request, template_name="register.html"):
    if request.method == 'POST':
        postdata = request.POST.copy()
        form = UserCreationForm(postdata)
        if form.is_valid():
            form.save()
            un = postdata.get('username', '')
            pw = postdata.get('password1', '')
            new_user = authenticate(username=un, password=pw)
            if new_user and new_user.is_active:
                auth_login(request, new_user)
	     new_user.is_logedin = True
                new_user.save()
                url = urlresolvers.reverse('profile')
                return HttpResponseRedirect(url)
    else:
        form = UserCreationForm()
    page_title = 'Регистрация'
    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

Теперь нужно создать функцию для входа на сайт

from django.contrib.auth import auth_login, authenticate, REDIRECT_FIELD_NAME
from django.contrib.auth.forms import AuthenticationForm

def login(request, template_name='login.html', current_app=None, extra_context=None):
    redirect_field_name = REDIRECT_FIELD_NAME
    authentication_form = AuthenticationForm
    redirect_to = request.REQUEST.get(redirect_field_name, '')
    if request.method == "POST":
        form = authentication_form(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            if user.is_logedin:
                url = "%s?next=%s" % (urlresolvers.reverse('logout_login'), redirect_to)
                return HttpResponseRedirect(url)
            user.is_logedin = True
            user.save()
            auth_login(request, user)

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect(redirect_to)
    elif request.user.is_authenticated():
        return HttpResponseRedirect(urlresolvers.reverse('profile'))
    else:
        form = authentication_form(request)
        next = redirect_to
    request.session.set_test_cookie()
    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

И как вы должны были заметить имеется переадресация на logout_login давайте ее создадим, эта функция будет отвечать за возможность выхода с сайта если пользователь числится залолиненым и скажем отчистил свои куки в браузере

def logout_login(request, template_name='logout_login.html',):

    redirect_field_name = REDIRECT_FIELD_NAME
    authentication_form = AuthenticationForm
    redirect_to = request.REQUEST.get(redirect_field_name, '')

    if request.user.is_authenticated():
        return HttpResponseRedirect(urlresolvers.reverse('profile'))

    if request.method == "POST":
        form = authentication_form(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            [s.delete() for s in Session.objects.all() if s.get_decoded().get('_auth_user_id') == user.id]
            auth_login(request, user)

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect(redirect_to)
    else:
        form = authentication_form(request)
        next = redirect_to
    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

Теперь нам осталось обеспечить пользователям возможность выйти с сайта

def logout(request, next_page=None,
           template_name='logged_out.html',
           redirect_field_name=REDIRECT_FIELD_NAME,
           current_app=None, extra_context=None):

    user = request.user
    user.is_logedin = False
    auth_logout(request)
    user.save()
    if redirect_field_name in request.REQUEST:
        next_page = request.REQUEST[redirect_field_name]
    if next_page:
        return HttpResponseRedirect(next_page)

    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

Вот собственно и все.

Комментарии (0)

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Вы можете авторизоваться на сайте через:
    YandexGoogleVkontakte
    /*Поиск...*/

    /*Последние комментарии*/
    Александр Буданов 16 октября 2014, 14:20
    Создание собственной модели User в Django 13
    Игорь Олешко 11 октября 2014, 13:45
    Настройка сервера для Django. Gunicorn + Nginx + Ubuntu 2
    Вадик Демидов 14 августа 2014, 12:01
    Реализация простой корзины на Django 1
    Alex Vakhitov 29 января 2014, 06:07
    Немного о ЖКХ 2
    Alex Vakhitov 28 января 2014, 13:51
    Установка NGINX-RTMP 2
    Alexandr Fukalov 09 декабря 2013, 13:17
    Установка GitLab и Redmine на Ubuntu 12.04 15
    Alex Vakhitov 20 июня 2013, 20:29
    Шаблона Foundation для ModX 2
    /*Подписка*/

    добавить на Яндекс

    /*Twitter*/
    /*Реклама*/