Django:当用户返回上一页或返回登录页面时如何重定向或断开用户连接
Django: How to redirect or disconnect the user when he came back to the previous page or coming back to the login page
在此先感谢您对这个问题的帮助。
我希望用户在我的 Django 网络应用程序中自动重定向到另一个页面,以防他单击按钮以返回到最后一页,或者当他再次返回到登录页面时我想断开它,当他仍然登录并尝试访问注册页面时,我会断开它或从我的网站重定向到另一个页面。
我已经尝试过 LoginMixin 和重定向,但没有成功。
当我已经登录并返回到上一页时,我的意思是登录页面我仍然登录并且即使我已经登录我也有登录页面,同样我可以返回注册页面但我已经登录了。
我使用的是最新版本的Django 2.1.7。
所以帮助任何帮助将不胜感激。
再次感谢。
这是我的正确代码。也许他可以帮助其他人。
def login(request):
if request.user.is_authenticated:
return redirect('index')
else:
if request.method == 'POST':
email = request.POST['email']
password = request.POST['password']
def get_next_url():
#request = self.request
next_ = request.GET.get('next')
next_post = request.POST.get('next')
redirect_path = next_ or next_post or None
if is_safe_url(redirect_path, request.get_host()):
return redirect_path
return 'user-home'
# def get_client_ip(request):
# x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
# if x_forwarded_for:
# ip = x_forwarded_for.split(',')[0]
# else:
# ip = request.META.get('REMOTE_ADDR')
# return ip
def get_ip_address_from_request(request):
""" Makes the best attempt to get the client's real IP or return the loopback """
PRIVATE_IPS_PREFIX = ('10.', '172.', '192.', '127.')
ip_address = ''
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '')
if x_forwarded_for and ',' not in x_forwarded_for:
if not x_forwarded_for.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_forwarded_for):
ip_address = x_forwarded_for.strip()
else:
ips = [ip.strip() for ip in x_forwarded_for.split(',')]
for ip in ips:
if ip.startswith(PRIVATE_IPS_PREFIX):
continue
elif not is_valid_ip(ip):
continue
else:
ip_address = ip
break
if not ip_address:
x_real_ip = request.META.get('HTTP_X_REAL_IP', '')
if x_real_ip:
if not x_real_ip.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_real_ip):
ip_address = x_real_ip.strip()
if not ip_address:
remote_addr = request.META.get('REMOTE_ADDR', '')
if remote_addr:
if not remote_addr.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(remote_addr):
ip_address = remote_addr.strip()
if not ip_address:
ip = request.META.get('REMOTE_ADDR')
ip_address = ip
return ip_address
try:
ip = get_ip_address_from_request(request)
user = User.objects.get(email=email)
if user.check_password(password) and user.is_active:
email = user.email
user = auth.authenticate(email=email, password=password)
auth.login(request, user)
alert_connection = User.objects.filter(connection_info=True)
if alert_connection:
base_url = getattr(settings, 'BASE_URL', 'http://www.dram-access.com')
context = {
'base_url': base_url,
'ip': ip,
'email': request.user.email,
'first_name': request.user.first_name,
'last_name': request.user.last_name
}
txt_ = get_template("accounts/emails/send_just_logged.txt").render(context)
html_ = get_template("accounts/emails/send_just_logged.html").render(context)
subject = 'New connection on your DreamAccess account'
from_email = settings.DEFAULT_FROM_EMAIL
recipient_list = [request.user.email]
send_mail(
subject,
message=txt_,
from_email=from_email,
recipient_list=recipient_list,
html_message = html_,
fail_silently=False,
)
messages.success(request, 'You are now logged in on DreamAccess')
next_path = get_next_url()
return redirect(next_path)
elif user.check_password(password):
qs = User.objects.filter(email=email)
if qs.exists():
#user email registered check active
not_active = qs.filter(is_active=False).exists()
confirm_email = EmailActivation.objects.filter(email=email, activated=False, forced_expired=False)
#is_confirmable = confirm_email.confirmable().exists()
if confirm_email and not_active:
return redirect('account-user-inactive')
elif not_active:
return redirect("send-reactivation-message")
else:
messages.error(request, "Your password is invalid")
return redirect('login')
except User.DoesNotExist:
messages.error(request, "This username and password doesn't exist on DreamAccess")
return redirect('login')
else:
return render(request, 'accounts/login.html')`
我的注册页面代码:
def register(request):
if request.user.is_authenticated:
return redirect('index')
else:
form = RegisterForm(request.POST, request.FILES or None)
context = {
'form': form
}
if form.is_valid():
#form.save()
first_name = form.cleaned_data.get('first_name')
last_name = form.cleaned_data.get('last_name')
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
country = form.cleaned_data.get('country')
types = form.cleaned_data.get('types')
password = form.cleaned_data.get('password')
password2 = form.cleaned_data.get('password2')
phone = form.cleaned_data.get('phone')
profile_pic = form.cleaned_data.get('profile_pic')
new_user = User.objects.create_user(first_name, last_name, username, email, country, types, password, phone, profile_pic)
else:
return render(request, 'accounts/register.html', context)
请提供您的代码(如果有)。在注册页面视图中,您的代码应如下所示:
if request.user.is_authenticated:
# HttpResponseRedirect('/redirectToNonRegisterPageURL/')
...
else:
# Load Sign Up Form
...
在此先感谢您对这个问题的帮助。
我希望用户在我的 Django 网络应用程序中自动重定向到另一个页面,以防他单击按钮以返回到最后一页,或者当他再次返回到登录页面时我想断开它,当他仍然登录并尝试访问注册页面时,我会断开它或从我的网站重定向到另一个页面。
我已经尝试过 LoginMixin 和重定向,但没有成功。 当我已经登录并返回到上一页时,我的意思是登录页面我仍然登录并且即使我已经登录我也有登录页面,同样我可以返回注册页面但我已经登录了。
我使用的是最新版本的Django 2.1.7。 所以帮助任何帮助将不胜感激。
再次感谢。
这是我的正确代码。也许他可以帮助其他人。
def login(request):
if request.user.is_authenticated:
return redirect('index')
else:
if request.method == 'POST':
email = request.POST['email']
password = request.POST['password']
def get_next_url():
#request = self.request
next_ = request.GET.get('next')
next_post = request.POST.get('next')
redirect_path = next_ or next_post or None
if is_safe_url(redirect_path, request.get_host()):
return redirect_path
return 'user-home'
# def get_client_ip(request):
# x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
# if x_forwarded_for:
# ip = x_forwarded_for.split(',')[0]
# else:
# ip = request.META.get('REMOTE_ADDR')
# return ip
def get_ip_address_from_request(request):
""" Makes the best attempt to get the client's real IP or return the loopback """
PRIVATE_IPS_PREFIX = ('10.', '172.', '192.', '127.')
ip_address = ''
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', '')
if x_forwarded_for and ',' not in x_forwarded_for:
if not x_forwarded_for.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_forwarded_for):
ip_address = x_forwarded_for.strip()
else:
ips = [ip.strip() for ip in x_forwarded_for.split(',')]
for ip in ips:
if ip.startswith(PRIVATE_IPS_PREFIX):
continue
elif not is_valid_ip(ip):
continue
else:
ip_address = ip
break
if not ip_address:
x_real_ip = request.META.get('HTTP_X_REAL_IP', '')
if x_real_ip:
if not x_real_ip.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(x_real_ip):
ip_address = x_real_ip.strip()
if not ip_address:
remote_addr = request.META.get('REMOTE_ADDR', '')
if remote_addr:
if not remote_addr.startswith(PRIVATE_IPS_PREFIX) and is_valid_ip(remote_addr):
ip_address = remote_addr.strip()
if not ip_address:
ip = request.META.get('REMOTE_ADDR')
ip_address = ip
return ip_address
try:
ip = get_ip_address_from_request(request)
user = User.objects.get(email=email)
if user.check_password(password) and user.is_active:
email = user.email
user = auth.authenticate(email=email, password=password)
auth.login(request, user)
alert_connection = User.objects.filter(connection_info=True)
if alert_connection:
base_url = getattr(settings, 'BASE_URL', 'http://www.dram-access.com')
context = {
'base_url': base_url,
'ip': ip,
'email': request.user.email,
'first_name': request.user.first_name,
'last_name': request.user.last_name
}
txt_ = get_template("accounts/emails/send_just_logged.txt").render(context)
html_ = get_template("accounts/emails/send_just_logged.html").render(context)
subject = 'New connection on your DreamAccess account'
from_email = settings.DEFAULT_FROM_EMAIL
recipient_list = [request.user.email]
send_mail(
subject,
message=txt_,
from_email=from_email,
recipient_list=recipient_list,
html_message = html_,
fail_silently=False,
)
messages.success(request, 'You are now logged in on DreamAccess')
next_path = get_next_url()
return redirect(next_path)
elif user.check_password(password):
qs = User.objects.filter(email=email)
if qs.exists():
#user email registered check active
not_active = qs.filter(is_active=False).exists()
confirm_email = EmailActivation.objects.filter(email=email, activated=False, forced_expired=False)
#is_confirmable = confirm_email.confirmable().exists()
if confirm_email and not_active:
return redirect('account-user-inactive')
elif not_active:
return redirect("send-reactivation-message")
else:
messages.error(request, "Your password is invalid")
return redirect('login')
except User.DoesNotExist:
messages.error(request, "This username and password doesn't exist on DreamAccess")
return redirect('login')
else:
return render(request, 'accounts/login.html')`
我的注册页面代码:
def register(request):
if request.user.is_authenticated:
return redirect('index')
else:
form = RegisterForm(request.POST, request.FILES or None)
context = {
'form': form
}
if form.is_valid():
#form.save()
first_name = form.cleaned_data.get('first_name')
last_name = form.cleaned_data.get('last_name')
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email')
country = form.cleaned_data.get('country')
types = form.cleaned_data.get('types')
password = form.cleaned_data.get('password')
password2 = form.cleaned_data.get('password2')
phone = form.cleaned_data.get('phone')
profile_pic = form.cleaned_data.get('profile_pic')
new_user = User.objects.create_user(first_name, last_name, username, email, country, types, password, phone, profile_pic)
else:
return render(request, 'accounts/register.html', context)
请提供您的代码(如果有)。在注册页面视图中,您的代码应如下所示:
if request.user.is_authenticated:
# HttpResponseRedirect('/redirectToNonRegisterPageURL/')
...
else:
# Load Sign Up Form
...