Django框架学习笔记(21.Session实例)

基于Cookie做用户验证时:不适合把敏感信息(如密码)放在Cookie中,因为可以Cookie是可以看见的。

Cookie优势:减轻了服务端的压力


接下来介绍Session:

    Cookie是保存在用户浏览器端的键值对

    Session是保存在服务器端的键值对,不过它还得依赖于Cookie

Session原理是生成随机字符串,对应一个放入数据的字典,Cookie传递这个随机字符串进行验证。

在Django中,简化了这个复杂的过程。

注意在用session使用之前要:makemigrations,migrate,因为Django的session默认保存在数据库中

实例:创建配置完成后:

urls.py:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/$', views.login),
    url(r'^index/$', views.index),
    url(r'^logout/$', views.logout),
]

view.py:

from django.shortcuts import render, redirect, HttpResponse


# Create your views here.
def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == "root" and pwd == "123":
            # 生成随机字符串
            # 写入用户浏览器Cookie
            # 保存到Session中
            # 在随机字符串对应的字典中设置相关内容
            request.session['username'] = user
            request.session['is_login'] = True
            if request.POST.get('rmb', None) == '1':
                request.session.set_expiry(60*60*24)
                #设置超时时间,默认的是两周
            return redirect('/index/')
        else:
            return render(request, 'login.html')


def index(request):
    if request.session.get('is_login', None):
        return render(request, 'index.html', {'username': request.session['username']})
    else:
        return HttpResponse('错误')


def logout(request):
    request.session.clear()
    return redirect('/login/')


login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login/" method="POST">
    <input type="text" name="user"/>
    <input type="password" name="pwd"/>
    <input type="checkbox" name="rmb" value="1"/>一天内免登录
    <input type="submit" value="登录"/>
</form>
</body>
</html>


index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>欢迎{{ username }}登录:{{ request.session.username }}</h1>
<a href="/logout/">注销</a>
</body>
</html>



效果:

Django框架学习笔记(21.Session实例)

Django框架学习笔记(21.Session实例)



在settings.py里面还有很多有关session的配置:

SESSION_COOKIE_AGE = 1209600
#session的cookie失效日期,默认两周

SESSION_EXPIRE_AT_BROWSER_CLOSE = False
#是否关闭浏览器使SESSION过期

SESSION_SAVE_EVERY_REQUEST = True
#是否每次请求都保存session,默认False,这里一般要改成True

设置session存放在哪里:

#SESSION_ENGINE = 'django.contrib.sessions.backends.db'
#设置保存在数据库

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242.11211',
        ]
    }
}
#设置在缓存