4.1-4.2 cookie和session
客户端存cookie
服务端存session
http协议是短链接
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
https://www.cnblogs.com/onda/p/7442591.html
功能:网页上登陆账号以后,再打开其他页面也不需要再输入用户名密码。退出登录以后,打开网页,需要重新登陆。
实现:
创建page 项目

urls.py
代码
from django.conf.urls import url
from django.contrib import admin
from demo01 import views
urlpatterns = \[
url(r'^admin/', admin.site.urls),
url(r'^test', views.Test),
url(r'^session', views.Session),
url(r'^del\_session', views.Del\_Se),
url(r'^login', views.login_demo),
url(r'^index', views.index_demo),
\]
views.py
代码
import json
from django.shortcuts import render,HttpResponse,redirect
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
from demo01 import models
def Test(request):
data_li=\['john', 'paul', 'george', 'ringo'\]
data\_obj\_li=models.UserInfo.objects.all()
p=Paginator(data\_obj\_li,2)
print('数据总数:',p.count)
print('数据页数:',p.num_pages)
print('数据页数:',p.page_range)
print('是否有下一页:',p.page(2).has_next())
print('是否有上一页:',p.page(2).has_previous())
print('是否有其他页:',p.page(2).has\_other\_pages())
print('下一页的页码:',p.page(2).next\_page\_number())
print('上一页的页码:',p.page(2).previous\_page\_number())
request.session\['login'\]=data_li
page=int(request.GET.get('page',1))
try:
data\_obj\_li = p.page(page)
except PageNotAnInteger:
data\_obj\_li = p.page(1)
except EmptyPage:
data\_obj\_li = p.page(p.num_pages)
# return HttpResponse('ok')
return render(request,'test.html',locals())
def Session(request):
get_session=request.session.get('login',False)
if get_session:
cookie_content=request.COOKIES
session_content=request.session
return render(request,'session.html',locals())
# return HttpResponse(json.dumps(get_session))
def Del_Se(request):
request.session.clear()
get_session=request.session.get('login',11)
return HttpResponse(json.dumps(get_session))
def login_demo(request):
if request.method == 'GET':
#第一次访问
return render(request,'login.html')
else:
username=request.POST.get('username',False)
password=request.POST.get('password',False)
if not username or not password:
#用户名密码是空
return HttpResponse('用户名密码不能为空')
else:
user_obj=models.UserInfo.objects.filter(UserName=username,
PassWord=password
)
if user_obj.first():
#登录成功
request.session\['login'\] = serializers.serialize("json",user_obj)
return redirect('/index')
else:
#登录失败
return HttpResponse('用户名密码错误')
def index_demo(request):
if request.session.get('login',False):
return HttpResponse('欢迎登录阿铭python系统')
else:
return redirect('/login')
login.html
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<form method="post">
用户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
session.html
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
COOKIE:{{ cookie_content }}
</div>
<div>
SESSION:{{ session_content }}
</div>
<a href="/test">返回</a>
</body>
</html>
test.html
代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table >
<thead>
<tr>
<th>用户名</th>
<th>密码</th>
<th>人名</th>
</tr>
</thead>
<tbody>
{% for item in data\_obj\_li %}
<tr>
<td>{{ item.UserName }}</td>
<td>{{ item.PassWord }}</td>
<td>{{ item.Name }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div>
<ul class="pagination" id="pager">
{% if data\_obj\_li.has_previous %}
<li class="previous"><a href="/test/?page={{ data\_obj\_li.previous\_page\_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %}
{% for num in p.page_range %}
{% if num == page %}
<li class="item active"><a href="/test/?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="/test/?page={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if data\_obj\_li.has_next %}
<li class="next"><a href="/test/?page={{ data\_obj\_li.next\_page\_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %}
</ul>
</div>
<a href="/session">跳转到session页面</a>
<a href="/del_session">删除session</a>
</body>
</html>
models.py
代码
from django.db import models
\# Create your models here.
class UserInfo(models.Model):
UserName=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='用户名')
PassWord=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='密码')
Name=models.CharField(max\_length=32,null=True,blank=True,verbose\_name='真名')
(venv) C:\Users\shenj\PycharmProjects\page>python manage.py makemigrations
(venv) C:\Users\shenj\PycharmProjects\page>python manage.py migrate
demo01_userinfo[db]

运行
访问127.0.0.1:8000/login/



访问127.0.0.1:8000/session

访问127.0.0.1:8000/del_session
清空session
访问127.0.0.1:8000/session

session 被清空
本文深入讲解了Cookie和Session的工作原理及应用,展示了如何在Django框架中使用它们进行用户认证和状态保持,包括创建项目、设置URLs、编写视图函数、处理登录状态等关键步骤。
1545

被折叠的 条评论
为什么被折叠?



