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中给List添加元素的4种方法分享
Nov 28 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
Python实现字典的遍历与排序功能示例
Dec 23 Python
python计算列表内各元素的个数实例
Jun 29 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python分布式编程实现过程解析
Nov 08 Python
python如何实现单链表的反转
Feb 10 Python
python实现飞机大战项目
Mar 11 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
Python装饰器的练习题
Nov 23 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
农民C键的运用技巧
2020/03/04 星际争霸
php 邮件发送问题解决
2014/03/22 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
复制js对象方法(详解)
2013/07/08 Javascript
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
python元组的概念知识点
2019/11/19 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
Jar包的作用是什么
2014/03/30 面试题
生产部厂长助理职位说明书
2014/03/03 职场文书
公司晚会策划方案
2014/05/17 职场文书
母亲节演讲稿
2014/05/27 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
元旦主持词开场白
2015/05/29 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
MySQL 如何设计统计数据表
2021/06/15 MySQL
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技