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中asyncore的用法实例
Sep 29 Python
python杀死一个线程的方法
Sep 06 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
浅析python继承与多重继承
Sep 13 Python
Python操作json的方法实例分析
Dec 06 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
Jan 15 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
Python生成词云的实现代码
Jan 14 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
python能自学吗
Jun 18 Python
python如何进入交互模式
Jul 06 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
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
php把数组值转换成键的方法
2015/07/13 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
利用js对象弹出一个层
2008/03/26 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
JavaScript中的this机制
2016/01/30 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python生成随机mac地址的方法
2015/03/16 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python中的json总结
2018/10/11 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
python修改FTP服务器上的文件名
2019/09/11 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
微信营销策划方案
2014/02/24 职场文书
初中军训感想300字
2014/03/05 职场文书
关于爱国的标语
2014/06/24 职场文书
新手初学Java网络编程
2021/07/07 Java/Android