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中使用copy模块实现列表(list)拷贝
Apr 14 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
解决python删除文件的权限错误问题
Apr 24 Python
python绘制直线的方法
Jun 30 Python
Python爬虫框架Scrapy基本用法入门教程
Jul 26 Python
python 多个参数不为空校验方法
Feb 14 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python求最大值最小值方法总结
Jun 25 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
python之生成多层json结构的实现
Feb 27 Python
python实现图像拼接功能
Mar 23 Python
Python爬虫后获取重定向url的两种方法
Jan 19 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缓存类代码(附详细说明)
2011/06/09 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
初识javascript 文档碎片
2010/07/13 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
js创建数组的简单方法
2016/07/27 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
使用Django清空数据库并重新生成
2020/04/03 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
小学生成长感言
2014/01/30 职场文书
化验室岗位职责
2015/02/14 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书