1. Cookie
1.1 设置cookie
1.1.1 在登录函数中,写代码,例如:

 1 def login(request):
 2     user = request.POST.get('user')
 3     pwd = request.POST.get('pwd')
 4     if user == 'zhangsan' and pwd == '123123':
 5     
 6         # 用户名和密码匹配成功,跳转到首页
 7         ret = redirect ('首页')
 8         
 9         # 设置cookie
10         ret.set_cookie(key,value)
11         return ret
12     esle:
13     
14         # 匹配不成功则跳转回登录页面
15         return render(request,'login.html')
View Code


1.1.2 设置普通的cookie

ret.set_cookie(key,value)

1.在设置cookie时,只能用response对象的返回值去设置
2.set_cookie中的key就是cookie的name,value是cookie的值
3.cookie就是保存在浏览器中的键值对

1.1.3  设置加盐的cookie

ret.set_signed_cookie(key,value,salt='盐')

1.在cookie中设置加盐,就和不设置的一样
2.设置后的结果就是value:随机字符串,这里面的value就是设置cookie中的value,所以并不安全
3.其余的参数:

max_age=时间      设置cookie的超时时间
expires=时间      设置IE浏览器的超时时间
path='/'         cookie生效路径,/表示根路径,
domain=域名       设置生效的二级域名
secure=False     是否支持https传输
httponly=False   是否只支持http协议传输      

 

1.2 获取cookie值
1.2.1 获取普通cookie值:

request.COOKIES['key']

 

1.2.2 获取加盐的cookie值:

request.get_signed_cookie('key')

 

1.2.3 删除cookie
删除cooki相当于在页面中退出当前登录的状态,那么就可以直接写成一个函数,例如

def logout(request):
    ret = redirect('/login/') # 先返回登录页面
    ret.delete_cookie('id_login') # 再删除cookie
    return ret

 

2. Session
cookie虽然在一定程度上解决了'保持状态'的需求,但由于cookie本身只支持4096个字节,以及cookie本身保存在client端,很可能被拦截或窃取,因此就诞生了
一种新的东西,比cookie更安全,支持字节跟多,并且是保存在服务器端,不容易被窃取到,那这就是session。

session是基于cookie而存在的

2.1 设置session两种方法

request.session.setdefult(key,value) # 如果值存在则不设置

request.session['key'] = value

 

2.2 获取session两种方法

request.session.get(key)

request.session['key']

 

2.3 删除session

del request.session['key'] # 只删除指定的一条session

 

2.4 删除当前会话的所有session数据

request.session.delete()

 

2.5 删除当前会话数据并清除浏览器上的cookie

request.session.flush()

 

2.6 删除所有失效日期小于当前日期的数据

request.session.clear_expired()

 

2.7 设置session的超时时间

request.session.set_expiry(value)
1、value是整数的话,那么session会在这些秒之后失效
2、value是datatime或timedelta,session会在这个时间后失效
3、value是0的话,那么关闭浏览器后session就会失效
4、value是None的话,session会依赖全局session失效错略
value的几种可能性

 

2.8 由于session用的request对象,所以在写退出登录的函数时,会有不同,session的写法:

def logout(request)
    ret = redirect('/login/') # 先返回到登录界面
    request.session.flush() # 清空所有session数据 
    return ret

 

2.9 Django中session的相关设置
2.9.1 数据库Session

SESSION_ENGINE = 'django.contrib.sessions.backends.db'     # 引擎(默认)

 

2.9.2 缓存Session

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

 

2.9.3 文件Session

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

 

2.9.4 缓存+数据库

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

 

2.9.5 加密Cookie Session

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

 

2.9.6 其他公用设置项:

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,默认修改之后才保存(默认)

 

3. 基于cookie

 1 from functools import wraps # 装饰器修复
 2 def check_login(func):
 3     @wraps(func)
 4     def inner(request,*args,**kwargs):
 5         # ret = request.COOKIES.get('is_login') # 获取普通cookie
 6         ret = request.get_signed_cookie('is_login') # 获取加盐cookie
 7         if ret == '1':
 8             return func(request,*args,**kwargs)
 9         else:
10             return_url = request.path_info
11             if return_url:
12                 return redirect('/login_and_register/?return_url=%s' %(return_url))
13     return inner
装饰器写法

在需要访问的页面上加上装饰器

 1 def login(request):
 2     if request.method == "POST":
 3         username = request.POST.get("username")
 4     passwd = request.POST.get("password")
 5         
 6     # 对用户名密码进行判断
 7     if username == "xxx" and passwd == "dashabi":
 8         
 9         # 获取没登录之前要访问的url
10         return_url = request.GET.get("return_url")
11             
12         # 判断访问的url
13         if return_url and return_url != "/logout/":
14             response = redirect(return_url)
15         else:
16             response = redirect("/login/")
17             
18         # 跳转成功后设置cookie
19         response.set_signed_cookie("is_login", "1", salt="SSS")   # 设置加盐cookie
20             
21         return response
22     return render(request, "login.html")
登录功能的写法

 

 

4. 基于session

 1 from functools import wraps # 装饰器修复
 2 def check_login(func):
 3     @wraps(func)
 4     def inner(request,*args,**kwargs):
 5         ret = request.session.get('is_login') # 设置session
 6         if ret == '1':
 7             return func(request,*args,**kwargs)
 8         else:
 9             return_url = request.path_info
10             if return_url:
11                 return redirect('/login_and_register/?return_url=%s' %(return_url))
12     return inner
装饰器写法

在需要访问的页面上加上装饰器

 1 def login(request):
 2     if request.method == "POST":
 3         username = request.POST.get("username")
 4         passwd = request.POST.get("password")
 5         if username == "xxx" and passwd == "dashabi":
 6             return_url = request.GET.get("return_url")
 7             if return_url and return_url != "/logout/":
 8                 response = redirect(return_url)
 9             else:
10                 response = redirect("/login/")
11              request.session.setdefault('is_login','1')
12              return response
13     return render(request, "login.html")    
登录功能的写法


posted on 2019-02-28 11:53  花豆豆  阅读(103)  评论(0编辑  收藏  举报