zoukankan      html  css  js  c++  java
  • 安全认证机制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=" 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 的网页中查看.
    
  • 相关阅读:
    MXCMS List标签说明
    c# 测量运行时间的方法
    简单的定时任务
    jQuery实现的简单文字提示效果模拟title
    ECSHOP设置默认配送方式和默认支付方式
    asp 里sql防止注入的方法
    asp.net上传图片并生成水印与缩略图的代码
    定时备份并清除系统日志的shell代码
    sql server 2005 万能分页存储过程
    01.部署NopCommerce时遇到的问题
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12397040.html
Copyright © 2011-2022 走看看