from django.shortcuts import redirect from django.shortcuts import render from login import models # 获取类才能orm操作库 """ cookie与session解决登录验证 1、models中创建UserInfo类 python manage.py makemigrations login /migrate login --database=login_db 2、urls.py全局中配置app的urls url(r‘^login/$‘, include(‘app_name.urls‘)) from django.conf.urls import url,include 3、在app下的views.py 创建视图函数 需求:登录除登录页面外,都需要登录才行!!! 思路: 1、用户打开页面,判断用户是否登录,已登录则直接打开,未登录则跳到登录页面登录 2、用户登录完成后,跳转到用户第一次访问时想要的页面 3、故实现上步需要提前获取用户要访问的页面url地址,保存下来 4、用户第一次登录时给用户配置一个cookie设置一个key:value保存状态 """ # 通过cookie解决登录验证 # 保存状态,服务器产生,让浏览器存放在浏览器端,一组组键值对,4096字节长度,不够大,不安全 # 校验登录装饰器 def check_login(func): def inner(request, *args, **kwargs): """获取用户想访问的url保存下来,判断cookie状态,确认用户是否登录""" print(request.path) return_url = request.path_info # 获取用户第一次访问的url,不含域名及参数 # if request.COOKIES.get(‘is_login‘, "") == ‘True‘: # 获取cookie,比较值,如果符合,说明已经登录,跳转到用户需求页面 if request.session.get(‘is_login‘, "") == ‘True‘: # session ret = func(request, *args, **kwargs) # 忘了写request参数,from表单里忘了{%csrf_token%} else: # 如何不符合跳转登录,且将用户想访问的url拼接到登录url后面,博客园就是这么做的 ret = redirect(‘/login/sigin/?ReturnUrl={}‘.format(return_url)) return ret return inner def login(request): """验证用户,及配置cookie""" err_msg = "" if request.method == ‘POST‘: username = request.POST.get(‘username‘).strip() password = request.POST.get(‘password‘).strip() # 获取前端传过来的用户名和密码 if not username or not password: err_msg = "用户名或密码不能为空" return render(request, ‘app_login.html‘, {‘err_msg‘: err_msg}) db_select = models.UserInfo.objects.filter(name=username, password=password) if db_select: # 如果正确的话,需要设置cookie相当于一个flag,设置cookie必须时response对象 return_url = request.GET.get(‘ReturnUrl‘, ‘/login/index/‘) # 获取用户要访问的页面,如果一开始就直接登录页面的话,成功后我们设置自动跳到index ret = redirect(return_url) # 跳转到用户未登录前要访问的页面 # ret.set_cookie(‘is_login‘, ‘True‘) # 设置cookie以dict形式保存,请求后可以F12查看 request.session[‘is_login‘] = ‘True‘ # session return ret # 就跳到用户想的要的页面,否则回到登录页面 else: # 用户名密码错误的话,提示错误,还是返回登录页面 err_msg = ‘用户名或密码错误,请重新登录‘ return render(request, ‘app_login.html‘, {‘err_msg‘: err_msg}) @check_login def logout(request): # 退出就跳到登录页面 rep = redirect(to=‘/login/sigin/‘) # rep.delete_cookie(‘is_login‘) request.session.delete() # session的删除方法 return rep @check_login def index(request): return render(request, ‘app_index.html‘) @check_login def home(request): return render(request, ‘app_home.html‘) # 问题? # 为什么post请求中可以通过return_url = request.GET.get(‘ReturnUrl‘, ‘/login/index/‘)
原文地址:https://www.cnblogs.com/sunxiuwen/p/9672018.html
时间: 2024-10-07 05:16:35