from django.http import HttpResponseRedirect, HttpResponseNotAllowed from django.shortcuts import render from django.utils.http import url_has_allowed_host_and_scheme from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout, get_user_model def get_next_url(request): next_url = request.POST.get('next', request.GET.get('next', '')) url_is_safe = url_has_allowed_host_and_scheme( url=next_url, allowed_hosts=request.get_host(), require_https=request.is_secure(), ) print(next_url if url_is_safe else '/') return next_url if url_is_safe else '/' def login(request): if request.method == 'GET': return _login_get(request) elif request.method == 'POST': return _login_post(request) else: return HttpResponseNotAllowed(permitted_methods=['GET', 'POST']) def _login_get(request): return render(request, template_name='users/login.html', context={'next': get_next_url(request)}) def _login_post(request): username = request.POST.get('username', '') password = request.POST.get('password', '') user = authenticate(request, username=username, password=password) if user is not None: auth_login(request, user) return HttpResponseRedirect(get_next_url(request)) else: return render( request, template_name='users/login.html', context={'next': get_next_url(request), 'error': 'Usuario o contraseña son incorrectos'} ) def logout(request): auth_logout(request) return HttpResponseRedirect(get_next_url(request)) def register(request): if request.method == 'GET': return _register_get(request) elif request.method == 'POST': return _register_post(request) else: return HttpResponseNotAllowed(permitted_methods=['GET', 'POST']) def _register_get(request): return render(request, template_name='users/register.html', context={'next': get_next_url(request)}) def _register_post(request): username = request.POST.get('username', '') password = request.POST.get('password', '') password_confirm = request.POST.get('password_confirm', '') email = request.POST.get('email', '') old = { 'username': username, 'email': email } if not username: return render( request, template_name='users/register.html', context={'next': get_next_url(request), 'error': 'Debe ingresar un nombre de usuario', 'old': old} ) if get_user_model().objects.filter(username=username).count() > 0: return render( request, template_name='users/register.html', context={'next': get_next_url(request), 'error': 'El nombre de usuario esta en uso', 'old': old} ) if password and password != password_confirm: return render( request, template_name='users/register.html', context={'next': get_next_url(request), 'error': 'Las contraseñas no coinciden', 'old': old} ) user = get_user_model().objects.create_user(username, email, password) auth_login(request, user) return HttpResponseRedirect(get_next_url(request))