Django中操作cookie和session

在Django中操作cookie和session

1.操作cookie

1.1 设置cookie

设置cookie是设置值给浏览器的。因此我们需要通过response的对象来设置,设置cookie可以通过response.set_cookie来设置,这个方法的相关线束如下:

  1. key:这个cookie的key
  2. value: 这个cookie的value
  3. max_age: 最长的生命周期。单位是秒
  4. expires: 过期时间
  5. path: 对域名下哪个路径有效。默认是针对主域名下都有效
  6. domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
  7. secure:是否是安全的,如果设置为True,那么只能在https协议下才可用
  8. httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作
def index(request):
    response = HttpResponse("index")
    expires = datetime(year=2019, month=5, day=29, hour=22, minute=30, second=0)
    expires = make_aware(expires)
    response.set_cookie("username", "sss", max_age=180)
    return response
1.2删除cookie

通过delete_cookie即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将他的过期时间设置为0,也就是浏览器关闭后就过期。

def delete_cookie(request):
    """删除cookie"""
    response = HttpResponse('delete')
    response.delete_cookie('username')
    return response
1.3获取cookie

获取浏览器发送过来的cookie信息。可以通过request.COOKIES来或者。这个对象是一个字典类型。比如获取所有的cookie,那么示例代码如下:

def my_list(request):
    """视图获取cookie信息"""
    cookie = request.COOKIES
    username = cookie.get('username')
    return HttpResponse(username)

2.操作session

django中的session默认情况下是存储在服务器的数据库中的,在表中会根据sessionid来提取指定的session数据,然后再把这个sessionid放到cookie中发送给浏览器存储,浏览器下次在向服务器发送请求的时候会自动的把所有cookie信息都发送给服务器,服务器再从cookie中获取sessionid,然后再从数据库中获取session数据。但是我们在操作session的时候,这些细节压根就不用管。我们只需要通过request.session即可操作。示例代码如下:

def index(request):
   request.session.get('username')
   return HttpResponse('index')
2.1设置session
request.session[key] = value
request.session.setdefault(key,value)
2.2获取session
request.session[key]
request.session.get[key]
2.3删除session
del request.session[key]   # 删除某一个键值对

request.session.delete()   # 删除该用户的所有session数据,不删除cookie

request.session.flush()    # 删除该用户的所有session数据,删除cookie

session常用的方法如下:

  1. get:用来从session中获取指定值。

  2. pop:从session中删除一个值。

  3. keys:从session中获取所有的键。

  4. items:从session中获取所有的值。

  5. clear:清除当前这个用户的session数据。

  6. flush:删除session并且删除在浏览器中存储的session_id,一般在注销的时候用得比较多。

  7. set_expiry(value):设置过期时间。

    • 整形:代表秒数,表示多少秒后过期。
    • 0:代表只要浏览器关闭,session就会过期。
    • None:会使用全局的session配置。在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是1209600秒,也就是2周的时间。
  8. clear_expired:清除过期的session。Django并不会清除过期的session,需要定期手动的清理,或者是在终端,使用命令行python manage.py clearsessions来清除过期的session。

修改session的存储机制

默认情况下,session数据是储存在数据中的。当然也可以将session数据储存到其他地方。可以设置SESSION_ENGINE来更改session的储存位置,这个可以配置为以下几种方案:

  1. django.contrib.sessions.backends.db:使用数据库。默认就是这种方案。
  2. django.contrib.sessions.backends.file:使用文件来存储session。
  3. django.contrib.sessions.backends.cache:使用缓存来存储session。想要将数据存储到缓存中,前提是你必须要在settings.py中配置好CACHES,并且是需要使用Memcached,而不能使用纯内存作为缓存。
  4. django.contrib.sessions.backends.cached_db:在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就可以保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,如果缓存中没有,那么就会从数据库中获取。
  5. django.contrib.sessions.backends.signed_cookies:将session信息加密后存储到浏览器的cookie中。这种方式要注意安全,建议设置SESSION_COOKIE_HTTPONLY=True,那么在浏览器中不能通过js来操作session数据,并且还需要对settings.py中的SECRET_KEY进行保密,因为一旦别人知道这个SECRET_KEY,那么就可以进行解密。另外还有就是在cookie中,存储的数据不能超过4k
import datetime
from django.shortcuts import render, HttpResponse, redirect


def index(request):
    print(request.COOKIES)  # 打印cookie
    is_login = request.COOKIES.get("is_login")  # 从cookie中获取登陆状态
    if not is_login:  # 判断登陆状态为False
        return redirect("/login/login/")  # 302重定向到登陆页面

    username = request.COOKIES.get("username")  # 获取cookie中的用户名
    login_time = request.COOKIES.get("login_time")  # 获取cookie中的登陆时间
    return render(request, 'index.html', {"username": username, "login_time": login_time})


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "xiao" and pwd == "123":
            obj = redirect("/login/index/")  # 302重定向到登陆页面
            obj.set_cookie("is_login", True)  # cookie设置登陆状态
            obj.set_cookie("username", user)  # cookie设置用户名
            now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            obj.set_cookie("login_time", now)  # cookie设置登陆时间
            return obj
    return render(request, "login.html")


def login_session(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "xiao" and pwd == "123":
            # 写session
            request.session['is_login'] = True  # session设置登陆状态
            request.session['username'] = user  # session设置用户名
            now = datetime.datetime.now().strftime("%Y-%m-%d %H:%m:%S")
            request.session['login_time'] = now  # session设置登陆时间
            return redirect("/login/index_session/")  # 302重定向到首页
    return render(request, "login.html")


def index_session(request):
    is_login = request.session.get("is_login")  # 从session中获取登陆状态
    if not is_login:  # 判断状态不是True时
        return redirect("/login/login_session/")  # 302重定向到登陆页面
    username = request.session.get("username")  # 从session中获取用户名
    login_time = request.session.get("login_time")  # 从session中获取登陆时间

    return render(request, "index.html", {"username": username, "login_time": login_time})


def logout(request):
    request.session.flush()   # 清理session
    return redirect("/login/login_session/")  # 302跳转登录页面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值