Django 之 session 的使用
session 是用来保持会话的机制.
它在 Django 中是被保存在 DB 里, 一般是名为 django_session 的表, 所以它是全局的, 那么它就可以用来保存登录用户的详细信息.
设置 : request.session[‘key’] = value (可以是字典)
获取 : request.session.get(‘key’, None) 第二个参数是默认值
销毁 : del request.session[‘key’]
登录成功后, 保存 session, 然后重定向(redirect)登录后的页面, 当然在登录后的页面里还要验证 session.
接下来, 就是什么时候销毁 session(不可能永远保持登录...), session 有默认的过期时间, Django 是两周, 可以在 settings.py 里的 SESSION_COOKIE_AGE 可设置, 单位秒. 还可以设置浏览器关闭时自动销毁, SESSION_EXPIRE_AT_BROWSER_CLOSE = True. 当然也可以通过 del request.session[‘key’] 来主动销毁.
上代码:
<span style="color: #0000ff">from</span> django.shortcuts <span style="color: #0000ff">import</span><span style="color: #000000"> redirect
</span><span style="color: #0000ff"></span>
<span style="color: #0000ff">def</span><span style="color: #000000"> All(request, p):
loginDict </span>= request.session.get(<span style="color: #800000">'</span><span style="color: #800000">is_login</span><span style="color: #800000">'</span><span style="color: #000000">, None)
</span><span style="color: #0000ff">if</span><span style="color: #000000"> loginDict :
currentPage </span>=<span style="color: #000000"> int(p)
start </span>= 5 * (currentPage - 1<span style="color: #000000">)
end </span>= 5 *<span style="color: #000000"> currentPage
itemList </span>=<span style="color: #000000"> Asset.objects.all()[start : end]
nMaxCount </span>=<span style="color: #000000"> Asset.objects.all().count()
nPages </span>= (nMaxCount + 5 -1)// 5<span style="color: #000000">
pageList </span>=<span style="color: #000000"> []
</span><span style="color: #0000ff">if</span> currentPage > 1<span style="color: #000000">:
pre_herf </span>= <span style="color: #800000">'</span><span style="color: #800000"><a href="/web/all/%d">上一页</a></span><span style="color: #800000">'</span> % (currentPage - 1<span style="color: #000000">)
pageList.append(mark_safe(pre_herf))
</span><span style="color: #0000ff">for</span> x <span style="color: #0000ff">in</span> range(1,nPages + 1<span style="color: #000000">):
herf </span>= <span style="color: #800000">'</span><span style="color: #800000"><a href="/web/all/%d">%d</a></span><span style="color: #800000">'</span> %<span style="color: #000000"> (x, x)
pageList.append(mark_safe(herf))
</span><span style="color: #0000ff">if</span> currentPage <<span style="color: #000000"> nPages:
next_herf </span>= <span style="color: #800000">'</span><span style="color: #800000"><a href="/web/all/%d">下一页</a></span><span style="color: #800000">'</span> % (currentPage + 1<span style="color: #000000">)
pageList.append(mark_safe(next_herf))
result </span>= render_to_response(<span style="color: #800000">'</span><span style="color: #800000">index.html</span><span style="color: #800000">'</span><span style="color: #000000">,
{</span><span style="color: #800000">'</span><span style="color: #800000">data</span><span style="color: #800000">'</span><span style="color: #000000">:itemList,
</span><span style="color: #800000">'</span><span style="color: #800000">count</span><span style="color: #800000">'</span><span style="color: #000000">:nMaxCount,
</span><span style="color: #800000">'</span><span style="color: #800000">pages</span><span style="color: #800000">'</span><span style="color: #000000">:nPages,
</span><span style="color: #800000">'</span><span style="color: #800000">pageList</span><span style="color: #800000">'</span><span style="color: #000000">:pageList,
</span><span style="color: #800000">'</span><span style="color: #800000">user</span><span style="color: #800000">'</span>:loginDict[<span style="color: #800000">'</span><span style="color: #800000">user</span><span style="color: #800000">'</span><span style="color: #000000">]})
</span><span style="color: #0000ff">return</span><span style="color: #000000"> result
</span><span style="color: #0000ff">return</span> redirect(<span style="color: #800000">'</span><span style="color: #800000">/web/login</span><span style="color: #800000">'</span><span style="color: #000000">)
</span><span style="color: #0000ff">def</span><span style="color: #000000"> Login(request):
</span><span style="color: #008000">#</span><span style="color: #008000">print request.method</span>
<span style="color: #0000ff">if</span> request.method == <span style="color: #800000">'</span><span style="color: #800000">POST</span><span style="color: #800000">'</span><span style="color: #000000">:
fname </span>= request.POST.get(<span style="color: #800000">'</span><span style="color: #800000">fname</span><span style="color: #800000">'</span>, None) <span style="color: #008000">#</span><span style="color: #008000"> 第二个参数是默认返回值</span>
lname = request.POST.get(<span style="color: #800000">'</span><span style="color: #800000">lname</span><span style="color: #800000">'</span><span style="color: #000000">, None)
result </span>= UserInfo.objects.filter(username=fname, password=<span style="color: #000000">lname).count()
</span><span style="color: #0000ff">if</span> result == 1<span style="color: #000000">:
</span><span style="color: #008000">#</span><span style="color: #008000">return HttpResponse('登录成功')</span>
request.session[<span style="color: #800000">'</span><span style="color: #800000">is_login</span><span style="color: #800000">'</span>] = {<span style="color: #800000">'</span><span style="color: #800000">user</span><span style="color: #800000">'</span><span style="color: #000000">:fname}
</span><span style="color: #0000ff">return</span> redirect(<span style="color: #800000">'</span><span style="color: #800000">/web/all</span><span style="color: #800000">'</span>) <span style="color: #008000">#</span><span style="color: #008000"> 这个可以是 完整的URL 或者 绝对路径</span>
<span style="color: #0000ff">else</span><span style="color: #000000">:
</span><span style="color: #0000ff">return</span> render_to_response(<span style="color: #800000">'</span><span style="color: #800000">login.html</span><span style="color: #800000">'</span>, {<span style="color: #800000">'</span><span style="color: #800000">status</span><span style="color: #800000">'</span>:<span style="color: #800000">'</span><span style="color: #800000">用户名或密码错误</span><span style="color: #800000">'</span><span style="color: #000000">})
</span><span style="color: #0000ff">return</span> render_to_response(<span style="color: #800000">'</span><span style="color: #800000">login.html</span><span style="color: #800000">'</span>)
<span style="color: #0000ff"><!</span><span style="color: #ff00ff">DOCTYPE html</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">html</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">head </span><span style="color: #ff0000">lang</span><span style="color: #0000ff">="en"</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">meta </span><span style="color: #ff0000">charset</span><span style="color: #0000ff">="UTF-8"</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">title</span><span style="color: #0000ff">></span>你好<span style="color: #0000ff"></</span><span style="color: #800000">title</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">head</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">body</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">div</span><span style="color: #0000ff">></span><span style="color: #000000">
用户: {{user}}
</span><span style="color: #0000ff"></</span><span style="color: #800000">div</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">div</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">table </span><span style="color: #ff0000">border</span><span style="color: #0000ff">="1px"</span><span style="color: #0000ff">></span><span style="color: #000000">
{% for item in data %}
</span><span style="color: #0000ff"><</span><span style="color: #800000">tr</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>{{item.id}}<span style="color: #0000ff"></</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>{{item.hostName}}<span style="color: #0000ff"></</span><span style="color: #800000">td</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">tr</span><span style="color: #0000ff">></span><span style="color: #000000">
{% endfor %}
</span><span style="color: #0000ff"></</span><span style="color: #800000">table</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">div</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">div</span><span style="color: #0000ff">></span><span style="color: #000000">
总条数: {{count}}
</span><span style="color: #0000ff"></</span><span style="color: #800000">div</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"><</span><span style="color: #800000">div</span><span style="color: #0000ff">></span><span style="color: #000000">
总页: {{pages}}
</span><span style="color: #0000ff"><</span><span style="color: #800000">br</span><span style="color: #0000ff">/></span><span style="color: #000000">
{% for item in pageList %}
</span><span style="color: #0000ff"><</span><span style="color: #800000">span</span><span style="color: #0000ff">></span>{{item}}<span style="color: #0000ff"></</span><span style="color: #800000">span</span><span style="color: #0000ff">></span><span style="color: #000000">
{% endfor %}
</span><span style="color: #0000ff"></</span><span style="color: #800000">div</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">body</span><span style="color: #0000ff">></span>
<span style="color: #0000ff"></</span><span style="color: #800000">html</span><span style="color: #0000ff">></span>
Django 中 cookies 和 session 的关系
只要是 HTTP 协议, 就会有 Cookie 这个东西; 只要你的浏览器没有禁用 Cookie, 就会使用它, 是不分用什么语言、用什么框架的, 在下次向服务器提交或者浏览的时候就会把上次保存下来的 Cookie 带上发送向服务器; BS 结构理论上是没有同步的服务器-客户端的状态维持的, 所以Cookie本质上就是一种异步的状态维护,所有这一切浏览器都帮我们搞定了, 所以不用关心. Django 中的 session 依赖于Cookie, 如果浏览器不支持 Cookie 的话, Django 的 Session 也就无从用起了.
每个用户过来都会生成一个以 cookies 为 key 的 session, 而这个它 的 value 又可以是一个字典, 可以用来保存这个用户的相关信息, 如登录名、IP等等. 3 t
Last updated