django之cookie,session相关

  1. 装饰器(加入functools.wraps装饰,保留函数的元数据--函数名/注释)

    1.1 orm字段中的verbose_name

    目前当注释用
    以后:在model form和form中使用
    import functools
    def wrapper(f):
     @functools.wraps(f)不加,获取的其实是inner的函数名和函数注释
     def inner(*args,**kwargs):
         return f(*args,**kwargs)
     return inner
    '''
    1.执行wrapper
    2.重新赋值
    index=wrapper(index)
    '''
    @wrapper
    def index(a1,a2):
     return a1+a2
    print(index.__name__)..................获取函数名
    print(index.__doc__)...................获取函数内的注释
  2. 什么是HTTP协议

    超文本传输协议
    关于连接:一次请求一次响应之后断开连接(无状态,短连接)
    关于格式:
     请求:请求头+请求体(http:www.baidu.com/index/?a=123)
     send('GET /index/?a=123 http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\n')
     send('POST /index/http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\nusername=alex&pwd=123')
     响应:响应头+响应体
         Content-Encoding:gzip\r\nCache-Control:private\r\n\r\n网页看到的HTML内容
    扩展:
     常见的请求头都有哪些?
     -user-agent:用什么浏览器访问的网站
     -content-type:请求体的数据格式是什么?(服务端按照格式要求进行解析)
     常见的请求方式:
     -GET
     -POST
     请求头直接用一个\r\n相连
     请求体之间用\r\n\r\n相连
  3. django请求生命周期/浏览器上输入http://www.xxx.com请求到django后发生了什么?

    路由西永中记得加入终止符$

    1570524288532

  4. 案例:博客系统

    用户名和密码检测
    xxxx.first()#返回对象或者None
    xxxx.exists()#返回布尔值
    
    模板查找顺序
     根目录templates
     根据app注册顺序去每个app的templates中找
    • 基本实现用户登录

    • 用户未登录就不能访问指定页面

      • 基于cookie实现

        cookie操作

        def login(request):
         return HttpResponse('...')
         return render('...')
         return redirect('...')
         设置cookie
         data = redirect('...')
         data.set_cookie()
         读取cookie
         request.COOKIES.get('xx')
         return data
        必须背会以下三个参数:
         key,value='',max_age=None

        应用场景:用户认证,投票,每页默认显示数据

        保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
        Cookie可以做登录之外,还可以做什么?
      • 基于session实现(推荐)

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

        问题:

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

        扩展

        • django和session相关的配置

          SESSION_COOKIE_NAME = "sessionid" # 
          Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串 
          
          SESSION_COOKIE_DOMAIN = None # 
          api.baidu.com /www.baidu.com/ xxx.baidu.com SESSION_COOKIE_PATH = "/" # Session的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,默认修改之后才保存
        • django中的session如何设置过期时间?

          SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
        • django的session默认存储在数据库,可以放在其他地方吗?

          小系统:默认放在数据库即可. 
          大系统:缓存(redis)
          
          文件
             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.LocMem Cache',
             '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']
        
        request.session.keys()
        request.session.values()
        request.session.items()
        
        request.session.set_expiry(value)
        request.session.session_key

        应用场景:用户认证,短信验证过期,权限管理

        强调:

        session中的数据是更具用户相互隔离
        #示例
        def login(request):
         获取用户提交的用户名和密码
         user = request.POST.get('user')
         request.session['user_name'] = user
        def index(request):
         print(request.session['user_name'])
      1. 通过js设置cookie

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

        path的作用

        /,当前网站中所有的URL都能读取到此值
        "",只能在当前页面访问的到此数据
        /index/,只能在/index/xxx的网页中查看

猜你喜欢

转载自www.cnblogs.com/-777/p/11636772.html