安全认证机制cookies session

django请求生命周期

文字描述
用户输入www.baidu.com 先wsgi协议(外部服务网关接口 实现这个协议的有两个wsgiref[本地测试用] uwsgi.[性能高]) 本质是socket 后面才是django
先到路由系统(路由匹配) 在到视图函数(执行逻辑 两步先通过orm 数据库取值 然后给模板渲染) 最后通过wsji返回给用户

img

案例:博客系统

第一步用户输入login进入登录页面

配置数据库

settings配置文件中
自己先在数据库中创建库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'cs',
        'USER':'root',
        'PASSWORD':'123',
        'HOST':'127.0.0.1',
        'PORT':3306,
    }
}
2 项目文件夹下的init文件中写上下面内容,用pymysql替换mysqldb
import pymysql
pymysql.install_as_MySQLdb()


settings配置文件中将 USE_TZ 的值改为 False
    # USE_TZ = True
    USE_TZ = False  # 告诉mysql存储时间时按照当地时间来寸,不要用utc时间
使用pycharm的数据库客户端的时候,时区问题要注意

键表
class UserInfo(models.Model):
    """
    用户表
    """
    username = models.CharField(verbose_name='用户名',max_length=32)
    password = models.CharField(verbose_name='密码',max_length=64)

配置路由系统

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/$', views.login),
    url(r'^index/$', views.index),
]

配置视图

from django.shortcuts import render,redirect
from app01 import models

def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')

    # 去数据库检查用户名密码是否正确
    # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
    # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
    user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()

    if user_object:
        # 用户登录成功
        request.session['user_name'] = user_object.username
        request.session['user_id'] = user_object.pk
        return redirect('/index/')

    # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'})


def auth(func):
    def inner(request,*args,**kwargs):
        name = request.session.get('user_name')
        if not name:
            return redirect('/login/')

        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    return render(request,'index.html')

配置模板

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;">
    <form class="form-horizontal" method="post">

        <div class="form-group">
            <label class="col-sm-2 control-label">用户名</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" placeholder="请输入用户名" name="user">
            </div>
        </div>
        <div class="form-group">
            <label class="col-sm-2 control-label">密码</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" placeholder="请输入密码" name="pwd">
            </div>
        </div>

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default">提 交</button>
                <span style="color: red;">{{ error }}</span>
            </div>
        </div>
    </form>
</div>


</body>
</html>

什么是cookie什么是session

 cookie
		定义:cookie是服务器让浏览器保存在浏览器本地的键值对
		原因:http是无状态,每次请求之间没有任何关系,无法保存状态。使用cookie来保存一些状态。
session
		定义:session是保存在服务器上的键值对,依赖于cookie
		原因:
			cookie在浏览器端 不太安全
			cookie长度受到限 session的长度没有限制
什么是cookie及 应用场景
cookie的运用方法?

什么是cookie?

定义:cookie是服务器让浏览器保存在浏览器本地的键值对
		原因:http是无状态,每次请求之间没有任何关系,无法保存状态。使用cookie来保存一些状态。
实列 用户登录
登录成功向其客户端发送一个令牌 (保存在用户器上的键值对)  用于下次确认身份

cookie的运用方法

1.通过js设置cookie
js查看cookie 
	document. cookie
js设置cookie 注意路径问题path  默认为空  有则覆盖 无则增加
	document. cookie = ' k1=wy222 ;path=/ '

注意: path不同会导致设置不同.
     path的作用
    /,当前网站中所有的URL都能读取到此值.
    ",只能在当前页面访问的到此数据
    /index/ ,只能在/index/xxx的网页中查看.
    
通过jquery设置     有则覆盖 无则增加
$. cookie('k1', 'wy222' ,{path:'/'})


通过py文件设置
# 设置cookie
	data.set_cookie('a1','1',path='/')
    data.set_cookie('a2','2',path='')
    data.set_cookie('a3','3',path='/test/')

# 读取cookie
request.COOKIES.get('cookie键') #判断有没这个值
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
# 用户登录成功
        result = redirect('/index/')
        result.set_cookie('xxxxxxxx',user)
        return result
        
用户输入index网址 后台进行判断 
def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    user = request.COOKIES.get('xxxxxxxx')#判断有没这个值
    if not user:
        return redirect('/login/')
    return render(request,'index.html',{'user':user})    
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
 
必须背会一下三个参数:
key 键, value='' 值, max_age=None 秒 多少秒后失效 path 路径



菜鸟教程
https://www.runoob.com/js/js-cookies.html

![1570527138385](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570527138385.png)

session

依赖cookie 是一种存储数据的方式,依赖于cookie,
实现本质: 用户向服务端发送请求,服务端做两件事:第一步为此用户开辟一个独立的空间来存放当前用户独有的值.第2步生成随机字符串发给客户端 他保存在游览器中 

在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456 

在空间中取值: 
request.session['x2'] 
request.session.get('x2') 推荐
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.

数据 django默认存在数据库中


装饰器

![1570528618057](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570528618057.png)

![1570528714941](file:///C:/Users/86131/AppData/Roaming/Typora/typora-user-images/1570528714941.png)

cookie和session的区别?

答: 
cookie是存储在客户端浏览器上的键值对,发送请求时浏 览器会自动携带. 

session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).
其本质是:用户向服务端发送请求,服务端做两件事:生成随机字符串;
为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值: 
request.session['x1'] = 123 request.session['x2'] = 456 
在空间中取值: 
request.session['x2'] 
request.session.get('x2') 
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.

session相关的配置

SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

SESSION_COOKIE_DOMAIN = None  #那个域名可以用 读取的到 none代表全部子域名


SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径 /默认所有的

SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输 True只可以读不可以改

SESSION_COOKIE_AGE = 1209600  #单位秒 Session的cookie失效日期(2周)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期

SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认false定时过期时间 如果改为true刷新一次过期时间程序计算

session如何设置过期时间?

SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)

session默认存储可以放在其他地方吗?

小系统:默认放在数据库即可. 大系统:缓存(redis)

在settings文件  里面加入里面的代码
# 文件
# SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# SESSION_FILE_PATH = '/sssss/'

# 缓存(内存)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
#
# CACHES = {
#     'default': {
#         'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
#         'LOCATION': 'unique-snowflake',
#     }
# }


# 缓存(redis)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
# CACHES = {
#     "default": {
#         "BACKEND": "django_redis.cache.RedisCache",
#         "LOCATION": "redis://127.0.0.1:6379",
#         "OPTIONS": {
#             "CLIENT_CLASS": "django_redis.client.DefaultClient",
#             "CONNECTION_POOL_KWARGS": {"max_connections": 100}
#             # "PASSWORD": "密码",
#         }
#     }
# }

操作session

# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456 
# 读取 request.session['xx'] request.session.get('xx') 
# 删除 del request.session['xx'] 其实是修改了过期时间
内容总结
1. 装饰器要加入functools.wrap装饰
2. orm字段中的verbose_name
3. 路由系统中记得加入终止符 $
4. 用户名和密码检测
5. 模板查找顺序
request.session.keys() request.session.values() request.session.items() request.session.set_expiry(value) request.session.session_key

通过js设置cookie

document.cookie = 'k1=wy222;path=/'
$.cookie('k1','wy222',{path:'/'})
注意:path不同会导致设置不同.

path的作用

/ , 当前网站中所有的URL都能读取到此值.
"",只能在当前页面访问的到此数据.
/index/ ,只能在/index/xxx 的网页中查看.
posted @ 2020-03-02 17:54  一起奥利给  阅读(453)  评论(0编辑  收藏  举报