Для одного проекта понадобилось запретить пользователям давать, другим людям, свой логин для входа на сайт. Честно скажу задача максимально тривиальная и пост пишу со стимулом «чтобы было»
В проекте использовалась 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))
Вот собственно и все.
- ← Управление доступом в Class Based Views
- Собственный команды для manage.py и использование crontab с Django →
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии (0)