Django-website 程序案例系列-10 cookie 和 session的应用

cookie:  现在所有网站基本都要开启cookie

  客户端浏览器上的一个文件

  例如:   {‘key’: 'sefwefqefwefw'} 是一个键值对

简单实现cookie认证:

user_in = {
    'zhangjian': {'pwd': '123'},
    'xiefengmei': {'pwd': '123'},
}
def log(request):
    if request.method == 'GET':
        return render(request, 'log.html')
    if request.method == 'POST':
        u = request.POST.get('username')
        p = request.POST.get('pwd')
        dic = user_in.get(u)
        if not dic:
            return render(request, 'log.html')
        if dic['pwd'] == p:
            res = redirect('/tpl/')
            res.set_cookie('username', u)
            return res
        else:
            return render(request, 'log.html')

def tpl(request):
    v = request.COOKIES.get('username')
    if not v:
        return redirect(request, '/log/')
    return render(request, 'tpl.html', {'current_user': v})

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ current_user }}</h1>
</body>
</html>

获取客户端的cookie:

request.COOKIES

request.COOKIES['username111']

request.COOKIES.get('username111')

设置用户cookie:

response = render(request, 'index.html')

response = redirect('/index/')

response.set_cookie('key',‘value’) #这种方式只能设置cookie, 关闭浏览器就会失效

return response

设置加密的cookie:

obj = HttpResponse('s')

obj.set_signed_cookie('username',"zhangjian",salt="wioahf2i3")  #设置加密的cookie,salt是一个加密字符串

request.get_signed_cookie('username',salt="wiioahf2i3") #接收加密的cookie,利用salt解密

cookie参数:

超时时间:

   1.response.set_cookie('key',‘value’,max_age=10) # max_age过期时间,cookie失效时间,多少秒之后失效

   2. import datetime

    current_date = datetime.datetime.utcnow() + datetime.timedelta(seconds=10)

    response.set_cookie('key',‘value’,expires=current_date)  # expires是到什么时间失效

路径:

  response.set_cookie('key',‘value’,path=‘/’)  #cookie生效的路径, ‘/’表示根路径,根路径的cookie可以被任何url访问

域名:

  response.set_cookie('key',‘value’,domain=None) #cookie生效的域名

其他:

  response.set_cookie('key',‘value’,secure=False) #如果是https的网站需要,改为True

  response.set_cookie('key',‘value’,httponly=False) #表示只能使用http协议传输,无法使用javascript获取(document.cookie)

JS操作cookie:

def user_list(request):
    current_page = request.GET.get('p', 1)
    current_page = int(current_page)
    val = request.COOKIES.get('per_page_count',10)       #取出前端JS传来的cookie里面的 ‘per_page_count’ ,默认值设置为10
    page_obj = Page(current_page, len(LIST), int(val)) 

    data = LIST[page_obj.start: page_obj.end]

    page_str = page_obj.page_str("/user_list/")
    return render(request, 'user_list.html', {'li': data, 'page_str': page_str})

HTML

    <script src="/static/jquery.min.js"></script>
    <script src="/static/jquery.cookie.js"></script>
    <script>
        $(function() {    #网页加载时运行          
            var v = $.cookie('per_page_count');   #加载网页时 取cookie里面‘per_page_count’的值v
            $('#ps').val(v);             #将值v设置到 id=ps 的标签里面
        });

        function changePageSize(ths) {
            var v = $(ths).val();           #绑定 onchange事件得到值 v
            $.cookie('per_page_count', v);  #将 v 设置到 键为‘per_page_count’里面
            location.reload();              #刷新网页
        };

    </script>

  

 简单的用JS设置一个cookie:

基于cookie做用户验证时:敏感信息不适合放在cookie中

session原理:

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

  session是保存在服务器端的键值对

    例如: session = afhashebwf213@!#: {

              'is_login': True,

              'user': 'zhang'

              'nid': ...

              ...

            }

# 基于session做用户验证
def logi(request): if request.method == "GET": return render(request, 'logi.html') elif request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'root' and pwd == "123": request.session['username'] = user # 给session中设置值 request.session['is_login'] = True  # 给session中设置值  return redirect('/ind/') else: return render(request, 'logi.html') def ind(request): if request.session['is_login']: # 获取session中的值 return HttpResponse(request.session['username']) else: return HttpResponse('请你登录')

  

# 获取、设置、删除Session中数据

request.session['k1']  #取k1的值 如果不存在报错
request.session.get('k1',None)  #取k1的值 如果不存在返回None
request.session['k1'= 123   #设置k1的值为123
request.session.setdefault('k1',123# 存在则不设置
del request.session['k1']  #删除k1
 
# 所有 键、值、键值对
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失效策略。
 
#注销时清空session
def logout(request):
     request.session.clear()
     return redirect('/login/')

#设置session来实现免登陆

<form action="/logi/" method="POST">
    <input type="text" name="user"/>
    <input type="text" name="pwd"/>
    <input type="checkbox" name="rmb" value="1" /> 10秒免登陆
    <input type="submit" value="提交"/>
</form>
def logi(request):
    if request.method == "GET":
        return render(request, 'logi.html')
    elif request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'root' and pwd == "123":
            request.session['username'] = user
            request.session['is_login'] = True
            if request.POST.get('rmb',None) == '1':
                request.session.set_expiry(10)  # 超时时间
            return redirect('/ind/')
        else:
            return render(request, 'logi.html')

#session配置文件及其参数:

settings.py里面配置管理

     SESSION_ENGINE = 'django.contrib.sessions.backends.cache'    # 引擎

    SESSION_CACHE_ALIAS = 'default'                                                   # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 
    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,默认修改之后才保存(每次用户操作需不需要更新过期时间)

#  引擎的配置Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

 1. 数据库:

  SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 表示把session放在数据库中

 2. 缓存:

   SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 表示把session放在缓存中存储

   SESSION_CACHE_ALIAS = 'memcache-1'
  
    CACHES = {    # 例如memcache连接信息
        'memcache-1': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }
3. 文件:
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 表示把session存储在临时文件中
    SESSION_FILE_PATH = os.path.join(BASE_DIR,'cache')    # 表示存储session的临时文件的文件路径
4. 缓存+数据库同时使用:
      SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' 
5. 加密cookie
     SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/kuku0223/p/7921923.html