Django会话,用户和注册之session
鉴于cookie的不安全,django自带的session框架会帮我们搞定这些问题
你可以用session 框架来存取每个访问者任意数据, 这些数据在服务器端存储,并对cookie的收发进行了抽象。 Cookies只存储数据的哈希会话ID,而不是数据本身,从而避免了大部分的常见cookie问题。我们来看下session如何使用
打开 Sessions功能
Sessions 功能是通过一个中间件和一个模型(model)来实现的。 要打开sessions功能,需要以下几步操作:
1 编辑 MIDDLEWARE_CLASSES 配置,确保 MIDDLEWARE_CLASSES 中包含 'django.contrib.sessions.middleware.SessionMiddleware'。
确认 INSTALLED_APPS 中有 'django.contrib.sessions'
2如果项目是用 startproject 来创建的,配置文件中都已经安装了这些东西,除非你自己删除,正常情况下,你无需任何设置就可以使用session功能。
如果不需要session功能,你可以删除 MIDDLEWARE_CLASSES 设置中的 SessionMiddleware 和 INSTALLED_APPS 设置中的 'django.contrib.sessions'
使用session:
SessionMiddleware 激活后,每个传给视图(view)函数的第一个参数``HttpRequest`` 对象都有一个 session 属性(request.session),这是一个字典型的对象。 你可以象用普通字典一样来用它。我们首先来看下seesion的内置函数用法:
request.session["k1"] 如果不存在则会报错
request.session.get["k1"],如果不存在则会报错,为了防止出错可以request.session.get('k1',none)
request.session['k1'] = 123 设置session值
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")
request.session.set_expiry(value)
默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的
如果value是个整数,session会在些秒数后失效。
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略。
配置setting.py
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
实例:
我们来看一个session的测试例子。
在下面的这个测试函数中,首先判断session中是否有count这个值,如果没有则设置初始值为1,如果存在则自动加1并在网页上呈现出counter的值
def test_with_session(request):
if 'count' in request.session:
request.session['count']+=1
return HttpResponse('new count=%s' % request.session['count'])
else:
request.session['count']=1
return HttpResponse('not count set in session. Setting to 1')
初次访问的时候,显示not count set in session。 Setting to 1
继续访问,count被设置为2
每次刷新count值都在自动增加
于此同时,我们来查看下浏览器上的cookie值。我们只找到了一个sessionid,确没有找到count值。而只找到一个sessionid值。前面我们在介绍session的时候提到过。Cookies只存储数据的哈希会话ID,而不是数据本身。这个sessionid就是哈希会话ID。通过这个sessionid我们就可以找到后端对应的count值。
那么这个sessionid是保存在哪里的呢。这个值也保存在后端的数据库中也就是db.sqlite3这个数据库文件中。我们有两种方法可以访问。
第一种:
在views.py中直接获取session数据库的数据,这里的pk值就是我们在浏览器中获取到的pk值。通过这个我们来找到
from django.contrib.sessions.models import Session
def get_session(request):
session=Session.objects.get(pk='gk613ezlc3chfimzg4fu9ofdqrbki3b7')
print session.session_data
print session.get_decoded()
print sess.expire_date
return HttpResponse()
得到如下的结果:
MDJkYjUwYzE0YmRmZDMzZTg4MGU0Yjg1MWIzYjA3ZTdiNjc5ZTI1Mjp7InVzZXJuYW1lIjoiemhmIiwiY291bnQiOjQsIl9hdXRoX3VzZXJfaGFzaCI6ImE5Y2IxZmM1MjlmYjU2Zjg1MWY5MWY3YjE0MGYwYmRhNzU2YjE2NzkiLCJfYXV0aF91c2VyX2lkIjoiMSIsIl9hdXRoX3VzZXJfYmFja2VuZCI6ImRqYW5nby5jb250cmliLmF1dGguYmFja2VuZHMuTW9kZWxCYWNrZW5kIn0=
{u'count':4}
2018-02-03 06:45:29.158000+00:00
get_decoded() 来读取实际的session数据。 这是必需的,因为字典存储为一种特定的编码格式
expire_date是session失效的日期。
第二种方式:
直接查询db.sqlite3数据库
首先要在命令行中使用sqlite3命令,必须先下载如下的文件。这个在sqlite3的官网中可以去下载。并将存储这些文件的路径加入到path属性中去
使用命令行进入
D:\django_test2>sqlite3 db.sqlite3
SQLite version 3.21.0 2017-10-24 18:55:49
Enter ".help" for usage hints.
查看里面的表,django_session就是存储对应的session表
sqlite> .table
auth_group django_content_type
auth_group_permissions django_migrations
auth_permission django_session
auth_user site_prj_author
auth_user_groups site_prj_book
auth_user_user_permissions site_prj_book_authors
django_admin_log site_prj_publisher
使用命令select * from django_session查看数据。最下面的这个就是我们对应的session值
第一个实例介绍了session的基本用法,下面我们来看第二个实例,一个简单的登录网站:
首先在views.py中定义如下函数
class UserForm(forms.Form):
username = forms.CharField()
登录函数
def login(request):
if request.method == "POST":
uf = UserForm(request.POST)
if uf.is_valid():
username = uf.cleaned_data['username']
request.session['username'] = username
return HttpResponseRedirect('/index/')
else:
uf = UserForm()
return render(request,'login.html',{'uf':uf})
登录之后的跳转页
def index(request):
username = request.session.get('username')
print username
return render(request,'index.html',{'username':username})
注销
def logout(request):
del request.session['username'] #删除session
return HttpResponse('logout ok!')
login.html:
<form method = 'post'>
{% csrf_token %}
{{uf.as_p}}
<input type="submit" value = "ok"/>
</form>
Index.html:
<div>
<h1>welcome {{username}}</h1>
<a href="/logout">logout</a>
</div>
我们来看登录:
输入用户名zhf1后跳转到index界面
此时我们来查看下session表中的值.调用get_session来查看。增加了一个username值
YjM4NzNkMmQzZjhmZDIxNDA4MGRhOTYzMWZjNDQwYTdlMmYxYzYxNTp7ImNvdW50Ijo1LCJ1c2VybmFtZSI6InpoZjEiLCJfYXV0aF91c2VyX2hhc2giOiJhOWNiMWZjNTI5ZmI1NmY4NTFmOTFmN2IxNDBmMGJkYTc1NmIxNjc5IiwiX2F1dGhfdXNlcl9pZCI6IjEiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCJ9
{u'count': 5, u'username': u'zhf1'}
在index.html中点击logout
此时我们再来查询session的值。此时username已经不存在
MjA2ZmFiNmY2NTk1NzdlODU3YmVjZTdhMTBiMGEwMjNjNWZiZjhjNjp7ImNvdW50Ijo1LCJfYXV0aF91c2VyX2hhc2giOiJhOWNiMWZjNTI5ZmI1NmY4NTFmOTFmN2IxNDBmMGJkYTc1NmIxNjc5IiwiX2F1dGhfdXNlcl9iYWNrZW5kIjoiZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5kcy5Nb2RlbEJhY2tlbmQiLCJfYXV0aF91c2VyX2lkIjoiMSJ9
{u'count': 5}
再次访问index页面,会看到welcome None
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架