python Django学习(13)——cookie和session

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_42567323/article/details/102587433
前言

    HTTP请求是无状态的,一个客户端第一次,第二次…第n词访问同一个服务器都是一样的,服务器都会按照一个新的连接处理.但是,有时候客户端需要服务器记住客户端的登录状态.比如说,我离开了一会,回来之后,仍然要保持之前的登录状态.这个时候就需要用到cookie和session了.

一.cookie

    cookie是服务器发送的保存在客户端的一个字符串,浏览器每次请求都会带上cookie.例如,在登录的时候,把用户名和密码保存在cookie中,只要cookie没过期,以后每次登录都可以自动登录,无需重复输入用户密码.
    下面通过一个例子来看cookie如何使用:
login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <form action="/app01/login/" method="post">
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="submit">
    </form>
</body>
</html>

views.py中:

# 模拟数据库
user_info = {
    'root':{'pwd':'123'},
    'fan':{'pwd':'111'},
}
def login(request):
    if request.method == "GET":
        return render(request,'login.html')

    if request.method == "POST":
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        dic = user_info.get(username)
        if not dic:
            return render(request,'login.html')
        if dic['pwd'] == pwd:
            res = redirect('/app01/index/')
            res.set_cookie('username',username,max_age=5)
            return res
        else:
            return render(request,'login.html')


def index(request):
    # 获取当前已经登录的用户
    v = request.COOKIES.get('username')
    if not v:
        return redirect('/app01/login/' )
    return render(request,'index.html',{'current_user':v})

    其中:

res.set_cookie('username',username,max_age=5)

    是设置cookie,这里的res是一个render,HttpResponse或者redirect对象.
    第一个参数是key,第二个参数是value,第三个参数是超时时间.

v = request.COOKIES.get('username')

    这里是获取我们设置的cookie.

cookie的其他方法:

# request,COOKIES是一个字典
    requst.COOKIES.get('username')  # 可以这样获取字典的内容


    # cookie设置内容
    response = render(requst,'index.html')  # 先创建一个render对象
    # 或者是redirect对象也行
    response.set_cookie('key','value')     # set_cookie是设置值,也是一个字典,
    # set_cookie有两个参数,第一个是key,第二个是vaule
    # 这样设置是设置cookie,但是关闭浏览器后,cookie就失效了
    # 当然了,还有其他参数.
    response.set_cookie('key','value',max_age=10)   #设置cookie,并且在10秒后失效
    import datetime
    current_time = datetime.datetime
    response.set_cookie('key','value',max_age=10,expires=current_time)
    #expires也是设置超时时间,但是这个的值是日期,而max_age是秒数

    response.set_cookie('key', 'value', max_age=10, expires=current_time,path='/')
    # path是设置cookie生效的路径,默认是'/',意思是所有的url都可以用,当然也可以自己设置

    response.set_cookie('key', 'value', max_age=10, expires=current_time, path='/',domain='')
    # domain:设置生效的域名

二.session

    cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,

    session则是解决了cookie的问题。session是保存在服务器端的一个大的字典,浏览器第一次访问服务器的时候,服务器把sessionid传到浏览器,然后浏览器把sessionid保存在lcookie中,每次访问时,带上这个标识,服务器就可以标识这个请求来自哪个用户。

    在用session时,首先要在settings.py中配置session(默认配置好了):

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]

    在执行session之前,要执行数据库的两个命令:

python manager.py makemigrations
python manager.py migrate

    这样做是因为session默认是将数据存在数据库中的.

    接下来就是设置session以及使用session:

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.



def login(request):
    if request.method == "GET":
        return render(request,'login.html')
    elif request.method == "POST":
        user = request.POST.get('username')
        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(10)      # 设置超时时间

            return redirect('/app01/index/')
        else:
            return render(request, 'login.html')

def index(request):
    # 获取当前用户的随机字符串
    # 根据随机字符串获取对应信息
    if request.session.get('is_login',None):
        return render(request,'index.html',{'data':request.session['username']})
    else:
        return HttpResponse('滚!')

def logout(request):
    # 首先清空session中的数据
    request.session.clear()
    return redirect('/app01/login/')

    设置session时,要做以下四件事情:

  • 生成随机字符串
  • 写到用户浏览器cookie
  • 保存到session中
  • 在随机字符串对应的字典中设置相关内容

    不过,在Django中,一句代码就搞定了:

request.session['username'] = user      # 这一句代码就干了上面的四步

    获取:

request.session.get('is_login',None)

    清空:

request.session.clear()

    当然,还有其他操作,这里就先不提了.

写在最后

    本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

猜你喜欢

转载自blog.csdn.net/weixin_42567323/article/details/102587433