session和cookie实现免密登录

要求:
登录注册
班级管理
学员管理
增删改查

1.定义数据库表结构
定义表结构关系

class Classes(models.Model):
      caption = models.CharField(max_length=32)

class Student(models.Model):
      name = models.CharField(max_length=32)
      cls = models.ForeignKey('Classes',on_delete=models.CASCADE,)
      username = models.CharField(max_length=32,default="")
      password = models.CharField(max_length=32,default="")

class Teacher(models.Model):
      name = models.CharField(max_length=32)
      username = models.CharField(max_length=32,default="")
      password = models.CharField(max_length=32,default="")
      cls = models.ManyToManyField('Classes') # 自动生成另外的表

class Administrator(models.Model):
      username = models.CharField(max_length=32,default="")
      password = models.CharField(max_length=32,default="")
python manage.py makemigrations
python manage.py migrate

2.登录、注册
提交数据:
- Form
- Ajax
登录:
- 成功: 记住状态 <->保持会话
- 失败: 错误提示

3.Cookie
保存在浏览器端的键值对。可以利用其做免密登录
1、保存在用户浏览器
2、可以主动清除
3、也可以被“伪造”(爬虫)
4、跨域名cookie不共享 (各个服务器返回的cookie不同)
5、浏览器可以设置不接收cookie

4.设置cookie属性
服务端设置的Cookie

url(r'^test.html', views.test)

import datetime
def test(request):
    print(request.COOKIES)
    obj = HttpResponse('Ok')
    obj.set_cookie('k1', 'v1')  # 设置cookie对 k1:v1
    obj.set_cookie('k1', 'v1', max_age=4)  # 10s后失效
    
    v = datetime.datetime.utcnow( ) + datetime.timedelta(seconds=10)  # 当前的统一时间加延时10s
    obj.set_cookie('k1', 'v1', max_age=10, expires=v)
    obj.set_cookie('k3', '333333', max_age=10, expires=v, path='/')
    obj.set_cookie('k5', 'v5', max_age=10, expires=v, domain='***')
    obj.set_cookie('k7', 'v7', httponly=True)
    return obj

获取cookie

url(r'^kk.html', views.kk),
def kk(request):
    v = request.COOKIES.get('k7')
    return HttpResponse(v)

参数

	path: 
	    /       # 表示设置cookie全局生效 当前域名下所有url。默认
	    /xxxx/  # 表示只有当前url生效设置cookie  
	domian:
	    obj.set_cookie('k4','v4',max_age=10,expires=v,path='/', domain='*******') # 设置的cookie为此域名下操作,默认为None。可以对域名设置,更改本地hosts文件,并放入domain中。
	    obj.set_cookie('k1','v1')
	httponly:   # 仅仅HTTP网络传输使用 通过js不可获取 但是可以通过抓包获取

cookie实现免密登录

url(r'^login.html', views.login),
url(r'^index.html', views.index),
def login(request):
    message = ""
    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        c = models.Administrator.objects.filter(username=user, password=pwd).count() # 判断是否在数据库中
        if c:
            rep = redirect('/index.html')
            rep.set_signed_cookie('username', user)
            rep.set_signed_cookie('pwd', '1231456')
            return rep
        else:
            message = "用户名或密码错误"
    return render(request,'login.html', {'msg': message}) # 传参数为空字符串

def index(request):
    # 如果用户已经登录,获取当前登录的用户名。否则,返回登录页面
    username = request.get_signed_cookie('username')
    if username:
        return render(request, 'index.html', {'username': username})
    else:
        return redirect('/login.html')
login.html
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        label{
            width: 80px;
            text-align: right;
            display: inline-block;
        }
    </style>
</head>
<body>
    <form action="login.html" method="post">
        <div>
            <label for="user">用户名:</label>
            <input id="user" type="text" name="user" />
        </div>
        <div>
            <label for="pwd">密码:</label>
            <input id="pwd" type="password" name="pwd" />
        </div>
        <div>
            <label> </label>
            <input type="submit" value="登录" />
            <span style="color: red;">{{ msg }}</span>
        </div>
    </form>
</body>
index.html
<body>
    <h1>Hello {{ username }}</h1>
    <a href="/logout.html">注销</a>
</body>

客户端浏览器上操作cookie
jquery插件

url(r'^js_cookie$', views.js_cookie),
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/jquery-2.1.4.min.js"></script>
    <script src="/static/jquery.cookie.js"></script>
</head>

在console下

	$.cookie()
	//一个参数: 
	$.cookie('zzz') 获取值
	//二个参数: 
	$.cookie('k','v',{'path': '/js_cookie'}) //可以加和后端一样的参数 expires支持两种形式

Cookie的应用
登录认证
普通cookie
- obj.set_cookie(‘k7’,‘v7’)
- 敏感信息不宜放置在cookie中,可以放在数据库,频繁操作数据库
签名的cookie
- obj.set_signed_cookie(‘k7’,‘v7’)
- 敏感信息(可能会解密) 仍不宜放置在cookie中,敏感信息放在数据库,频繁操作数据库

cookie做认证时,将不敏感的信息放在cookie中,敏感信息放入数据库,频繁操作数据库

5.Session
session是服务器端的一个键值对 保存的是对象 随机字符串。
内部依赖于cookie

# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)

request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置

del request.session['k1']
request.session.clear()
# 获取所有键、值、键值对
request.session.keys()
request.session.values()
request.session.items()

request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查用户session的随机字符串 在数据库中是否存在
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")       

session实现免密登录

def login(request):
    message = ""
    if request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        c = models.Administrator.objects.filter(username=user, password=pwd).count()
        if c:
            request.session['is_login3334'] = True
            request.session['username3334'] = user
            rep = redirect('/index.html')
            return rep
        else:
            message = "用户名或密码错误"
    obj = render(request,'login.html', {'msg': message})
    return obj

def index(request):
    # 如果用户已经登录,获取当前登录的用户名。否则,返回登录页面
    username = request.session.get('username3334',None)
    if username:
        return render(request, 'index.html', {'username': username})
    else:
        return redirect('/login.html')

def logout(request):
    request.session.clear()
    return redirect('/login.html')
为了在Windows安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows安装ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.csdn.net/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows安装使用ADB简单易懂教程](https://blog.csdn.net/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值