Python Django简单实现session登录注销过程详解


Posted in Python onAugust 06, 2019

开发工具:pycharm

简单实现session的登录注销功能

Django配置好路由分发功能

默认session在Django里面的超时时间是两周

使用request.session.set_expiry(60)设置超时时间,以秒为单位

在Django配置文件里配置session链接 https://3water.com/article/166988.htm

urlpatterns = [
 path('admin/', admin.site.urls),
 path('app01/', include('app01.urls'))
]

app01/urls.py的路由如下

urlpatterns = [
 path('login/', views.login),
 path('index/', views.index),
]

app01/views.py视图的内容如下

# Create your views here.
from django.shortcuts import HttpResponse, render, redirect
def login(request):
 if request.method == 'GET':
  return render(request, 'login.html')
 elif request.method == 'POST':
  user = request.POST.get('username')
  pwd = request.POST.get('pwd')
  if user == 'song' and pwd == '123':
   # 往session里写入数据的时候,Django会自动生成随机码,发送给cookie,然后自己保留一份跟cookie一一对应
   request.session['username'] = user
   request.session['is_login'] = True
   #设置session(同时对应的cookie)超时时间,按秒计算
   request.session.set_expiry(60)
   # 路径已经要写全,把/app01带上,以前好像不带是可以的
   return redirect('/app01/index/')
  else:
   return render(request, 'login.html')
def index(request):
 # 拿到cookie对应的随机码,来查找session里的is_login字段是否True,如果通过则表示通过
 if request.session.get('is_login', None):
  return render(request, 'index.html')
 else:
  return HttpResponse('滚')
def logout(request):
 # 清除当前对应session所有数据
 request.session.clear()
 # 路径已经要写全,把/app01带上,以前好像不带是可以的
 return redirect('/app01/login')

templates目录的里login.html内容

form表单里路径一定要带上/app01的路径

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 <div>
  <form action="/app01/login/" method="post">
   <input type="text" name="username">
   <input type="password" name="pwd">
   <input type="submit" value="提交">
  </form>
 </div>
</body>
</html>

templates目录的里index.html内容

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 <h1>登录成功</h1>
 <div>
  <a href="/app01/logout/" rel="external nofollow" rel="external nofollow" >注销</a>
 </div>
</body>
</html>

重点重点重点!!!如果出现已下报错,则是因为session信息要保存到数据库中,而你的Django没创建session表呢,

所以要在命令行执行以下命令,来构造session表

python manage.py makemigrations
python manage.py migrate

Python Django简单实现session登录注销过程详解

==================================分割线=======================================================

带session信息版本的简单认证实现

models.py文件内容

from django.db import models
# Create your models here.
class UserInfo(models.Model):
 username = models.CharField(max_length=16)
 password = models.CharField(max_length=32)

urls.py文件内容

from django.contrib import admin
from django.urls import path,include
from app01 import views
from django.conf.urls import url
urlpatterns = [
 # path('login/', views.login),
 path('index/', views.index),
 # path('logout/', views.logout),
 # path('fm/', views.fm),
 path('aa/', views.aa),
 path('select/', views.select),
]

views.py文件的内容

# Create your views here.
from django.shortcuts import HttpResponse, render, redirect
from django.views.decorators.csrf import csrf_exempt,csrf_protect
from app01 import models
from functools import wraps
#做session验证的的装饰器,
def checklogin(func):
 @wraps(func)
 def wrapper(request,*args,**kwargs):
  if request.session.get('is_login') == '1':
   return func(request,*args,**kwargs)
  else:
   return redirect('/app01/aa')
 return wrapper

def aa(requrst):
 if requrst.method == 'GET':
  print('get')
  return render(requrst, 'aa.html')
 elif requrst.method == 'POST':
  username = requrst.POST.get('username')
  pwd = requrst.POST.get('password')
  user = models.UserInfo.objects.filter(username=username,password=pwd)
  # print(type(pwd))
  # print(models.UserInfo.objects.filter(username=username).values('password'))
  if user:
   #如果输入的账户名跟数据库中的账户名密码相匹配就忘session信息里写入一条is_login的数据
   #同时随机生成的字符串ID也写到cookie里当做sessionid使用
   requrst.session['is_login'] = '1'
   return redirect('/app01/index')
  return redirect('/app01/aa')

#在访问页面的时候先做验证,拿自己的cookie里的sessionid去跟服务器端的session_key做对比
#对比认证通过就允许访问
@checklogin
def index(request):
 return render(request,'index.html')

aa.html文件内容

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>aa</title>
</head>
<body>
 <h1>aa页面</h1>
 <form action="/app01/aa/" method="POST">
 {% csrf_token %}
  <p>用户名:
 <input type="text" name="username">
  </p>
  <p>密码:
 <input type="password" name="password">
  </p>
  <input type="submit" value="提交">
 </form>
</body>
</html>

index.html文件内容

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 <h1>登录成功</h1>
 <div>
  <a href="/app01/logout/" rel="external nofollow" rel="external nofollow" >注销</a>
 </div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python检测远程端口是否打开的方法
Mar 14 Python
Python字符串中查找子串小技巧
Apr 10 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
Python实现的多进程和多线程功能示例
May 29 Python
详解python分布式进程
Oct 08 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
使用Tensorflow实现可视化中间层和卷积层
Jan 24 Python
Python 去除字符串中指定字符串
Mar 05 Python
python神经网络编程实现手写数字识别
May 27 Python
Django框架中序列化和反序列化的例子
Aug 06 #Python
python异常触发及自定义异常类解析
Aug 06 #Python
Python DataFrame一列拆成多列以及一行拆成多行
Aug 06 #Python
Django中reverse反转并且传递参数的方法
Aug 06 #Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 #Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 #Python
对Django 转发和重定向的实例详解
Aug 06 #Python
You might like
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php删除数组元素示例分享
2014/02/17 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
js父页面中使用子页面的方法
2016/01/09 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
SVG描边动画
2017/02/23 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
Puppet的一些技巧
2018/09/17 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
python基于http下载视频或音频
2018/06/20 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
Python 判断奇数偶数的方法
2018/12/20 Python
python实现淘宝秒杀脚本
2020/06/23 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python实现飞行棋游戏
2020/02/05 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
辞职信怎么写?
2019/05/21 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js