一,什么是session?
session是一种会话保持技术。什么叫做会话保持呢?我举个例子,对讲机和打电话大概就是这个感觉了。浏览器请求服务器是无状态的,这是浏览器和服务器都遵守http协议决定的,浏览器和服务器的服务是使用socket套接字进行通信的,服务器将请求结果返回给浏览器后,会关闭当前的socket连接,并且销毁页面对象。所以用户每次使用浏览器给服务器请求时,都是新的请求。
session将用户登陆的信息保存在cookie中,而session会在数据库中单独生成一个数据表。
session与cookie
cookie常用于识别用户。cookie是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送cookie。 session通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。session变量存储单一用户的信息,并且对用于应用程序中的所有页面都是可用的。然而会话是临时的在用户离开网站后将被删除。session的工作机制是:为每个访客创建一个唯一的id(UID),并基于这个UID来储存变量。UID储存在cookie中,或者通过URL进行传导。
二,要解决登陆的问题,我们就要用到session。
1,检查settings里的配置,一般情况下,软件会自动生成。
INSTALLED_APPS=['django.contrib.sessions',]
MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware',]
2,在登陆成功和welcome的方法里引用session
if len(blogUserSet)==1:
#登录成功 print(request.session) session=request.session blogUserSet=blogUserSet.first() session['user']={"username":blogUserSet.username,'id':blogUserSet.id}#或={"username":username} uri=session.get('uri','/welcome') session.pop('uri',None) return redirect(uri)
def welcome(request): return render(request, 'welcome.html', {'user':request.session.get('user', None)})#{}里为请求作用域
3,做个测试,页面里有a和b两个超链接放在welcome的路径下。而a连接里的内容只有登陆的状态下才能查看,如果没登陆
就点击a,则会跳转去登陆界面。具体代码如下:
def a(request): if 'user' in request.session: return render(request,'bloguser/a.html',{}) else: request.session['uri']=request.get_raw_uri()#uri调用登陆成功的 return redirect(reverse('user:login')) def b(request): return render(request,'bloguser/b.html',{})a和b的路径写好就完了。