django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现

django中的cookie和session(02)–操作

一.Django中的cookie操作

ctrl + shift + del 是谷歌浏览器中清除页面缓存和cookie的快捷键

1.设置cookie

语法:

# 得到需要返回的的操作
rep = HttpResponse(...)
rep = render(request, ...)

# 设置cookie
rep.set_cookie(key,value,...)
# 设置加密cookie
rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)

# 参数:
	key, 			键
	value='', 		值
	max_age=None, 	超时时间
	expires=None, 	超时时间(IE requires expires, so set it if hasn't been already.)
	path='/', 		Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
	domain=None, 	Cookie生效的域名
	secure=False, 	https传输
	httponly=False 	只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

2.获取cookie

语法:

# 普通获取
request.COOKIES['key']  
# 获取加密cookie
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)  

# 参数:
	default: 默认值
	salt: 加密盐
	max_age: 后台控制过期时间

3.删除cookie

request.COOKIES["KEY"]  # 直接获取cookie的方法
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)  # 获取加密cookie的方式

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep

jQuery中操作cookie

$.cookie('the_cookie', 'the_value');  // 添加一个"会话cookie
$.cookie('the_cookie');  //读取cookie
$.cookie('the_cookie', null);   //删除cookie 通过传递null作为cookie的值即可

4.使用cookie实现简单的登陆校验:

数据库内有tom和bob两个用户名,密码均为123

views.py

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")

        query_list = models.UserInfo.objects.filter(username=username,password=password)
        if query_list.exists():
            ret = redirect('index')

            # ret.set_cookie("is_login", True, max_age=10)  # max_age=10  10秒之后失效
            # ret.set_cookie("username", username, max_age=10) # 10秒之后失效

            # 加密cookie的写法
            ret.set_signed_cookie("is_login", True, "salt", max_age=10)
            ret.set_signed_cookie("username", username, "salt", max_age=10)

            return ret  # 登陆成功后跳转主页
        else:
            return render(request,"login.html")  # 登陆失败之后返回登陆页

def index(request):
    print(request.COOKIES)  # 打印看一下现在的cookie
    # is_login = request.COOKIES.get("is_login", False)
    # username = request.COOKIES.get("username")

    is_login = request.get_signed_cookie("is_login", False, "salt")
    username = request.get_signed_cookie("username",salt="salt")
    print(is_login)  # True
    print(type(is_login))  # <class 'str'>
    if is_login != 'True':
        return redirect('login')
    else:
        return render(request,"index.html",{"username":username})

login.html

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
<table>
    <tr>用户名<input type="text" name="username" id="username"></tr>
    <tr>密码<input type="password" name="password" id="password"></tr>
    <tr><input type="submit" value="登录"></tr>
    </table>
</form>

index.html

<h1>欢迎{{ username }}来到主页</h1>

数据库中的表


二.Django中的session操作

不同的网站session是不一样的,这些操作都只是django提供的方法,其他的框架不适用,需要自己来写关于cookie和session的方法.

1.获取session

request.session['k1'] 
request.session.get('k1',None) 

request.session这句是从cookie里面将sessionid的值取出来,将django-session表里面的对应sessionid的值的那条记录中的session-data字段的数据给取出来(并解密),get方法就取出k1这个键对应的值.但是django-session这个表,不能通过orm来直接控制,因为app中自己定义的models.py里面没有这个对应关系


2.设置session

生成随机字符串,自动将这个随机字符串和用户数据(加密后)和过期时间保存到了django-session表里面,之后会自动将这个随机字符串以sessionid:随机字符串的形式添加到cookie里面返回给浏览器,这个sessionid名字是可以改的

request.session['k1'] = 100
request.session.setdefault('k1', 10) # 默认值存在则不设置


3.删除session

常用:

# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()  

上面的方法常用,会清空所有cookie---删除session表里的这个会话的记录,这用于确保前面的会话数据不可以再次被用户的浏览器访问例如django.contrib.auth.logout() 函数中就会调用它。

其他删除方法:

# django-session表里内会同步删除
del request.session['k1']  

# 删除当前会话的所有Session数据
request.session.delete()

# 将所有Session失效日期小于当前日期的数据删除,将过期的删除
request.session.clear_expired()

4.其他的session相关方法

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()

# 会话session的key
session_key = request.session.session_key  获取sessionid的值

# 将所有Session失效日期小于当前日期的数据删除,将过期的删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key") #session_key就是那个sessionid的值

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()  #常用,清空所有cookie

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

## 5.Django中的Session配置

django中默认支持session, 其内部提供了5种类型的session供开发者使用

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用设置项:
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,默认修改之后才保存(默认)

## 6.使用session实现简单的登陆校验,注销
def login(request):
    if request.method == 'GET':
        return render(request,"login.html")
    else:
        username = request.POST.get("username")
        password = request.POST.get("password")
		# 查询用户名和密码
        ret_obj_list = models.UserInfo.objects.filter(username=username,password=password)
        if ret_obj_list.exists():
            request.session['session_login'] = True
            request.session['username'] = username

            # session中的数据相当于data = {"session_login":True,"user":username}
            return redirect("index")
        else:
            return render(request,"login.html")

def index(request):
    print(request.COOKIES)

    ret = request.session.get("session_login")  # 也可以这么写 ret = request.session["session_login"]
    print(ret, type(ret))

    if ret!=True:
        return redirect("login")
    else:
        username = request.session.get("username")
        return render(request, "index.html",{"username":username})

def logout(request):
    request.session.flush()
    return redirect('logout')

login.html

urls中login页面的别名为login,注销的url别名为‘logout’

<form action="{% url 'login' %}" method="post">
    {% csrf_token %}
<table>
    <tr>用户名<input type="text" name="username" id="username"></tr>
    <tr>密码<input type="password" name="password" id="password"></tr>
    <tr><input type="submit" value="登录"></tr>
    <tr><a href="{% url 'logout' %}">注销</a></tr>
    </table>
</form>

index.html

<h1>欢迎{{ username }}来到主页</h1>

posted @ 2019-03-07 19:46  robertx  阅读(425)  评论(0编辑  收藏  举报