• django7-cookie与session


    1.有状态服务与无状态服务

      服务实例存储了客户端的数据 ,那么这就是个有状态服务

      服务实例不存储客户端数据 ,让其他缓存存储客户端数据 ,这就是无状态服务 ,http就是无状态的

    2.什么是cookie

      服务端保存在客户端的键值对信息 ,每次客户端访问会携带cookie ,服务端对cookie进行判断操作

    3.登录功能封装cookie

      可以看到使用post请求给response对象封装了一个k:v ,跳转到presslist就会拿到这个值

    def presslist(request):
        ck = request.COOKIES.get('user')
        print(ck)
        msg_all = models.presslist.objects.all()
        return render(request, 'cbs.html', {'msg': msg_all})
    
    
    class tlogin(View):

    def get(self, request):
    if request.COOKIES.get('user'):
    return redirect(reverse('presslist'))
    return render(request, 'login.html')

    def post(self, request):
    user = request.POST.get('user')
    password = request.POST.get('password')
    print(user, password)
    if models.Author.objects.filter(name=user, password=password):
    ret = redirect(reverse('presslist'))
    # 在response对象中封装cookie ,下次客户端会带过来
    ret.set_cookie('user', 'auth')
    return ret

    return render(request, 'login.html')

      装饰器 :设想如果所有的视图都要求有cookie的客户端才使用 ,那么我们需要给每个视图加上判断cookie ,所以我们使用一个装饰器来完成 ,后面可以使用中间件对全局函数处理

    def wrap1(func):
        def inner(request, *args, **kwargs):
            if request.COOKIES.get('user'):
                ret = func(request, *args, **kwargs)
                return ret
            return redirect(reverse('tlogin'))
    
        return inner
    
    @wrap1
    def presslist
    ...
    @wrap1
    def pressadd
    ...
    @wrap1
    def pressedit
    ...
    @wrap1
    def pressdel
    
    def tlogin()
    ...

      保留用户搜索 :用户可以浏览我们的展示界面 ,但是使用新增的时候我们需要登录 ,登录后如果能跳转到新增页面才是符合体验的 ,所以我们要修改登录跳转

    ##如果没有登录 ,跳转登录页面时会携带一个参数 ,就是用户想访问,但是需要登录的地址
    def wrap1(func):
        def inner(request, *args, **kwargs):
            if request.COOKIES.get('user'):
                ret = func(request, *args, **kwargs)
                return ret
            # 保留用户记录 ,拼接到地址上
            nowurl = request.path_info
            return redirect(reverse('tlogin') + '?next={}'.format(nowurl))
    
        return inner
    
    ##如果登陆成功 ,这时候要求跳转到用户想访问,但是需要登录的地址 ,在url中取出来 ,如果没有默认就是去presslist
    class tlogin(View):
    
        def get(self, request):
            if request.COOKIES.get('user'):
                return redirect(reverse('presslist'))
            return render(request, 'login.html')
    
        def post(self, request):
            user = request.POST.get('user')
            password = request.POST.get('password')
            if models.Author.objects.filter(name=user, password=password):
                url = reverse('presslist')
                next = request.GET.get('next')
                if next:
                    url = next
                ret = redirect(url)
                # 在response对象中封装cookie ,下次客户端会带过来
                ret.set_cookie('user', 'auth')
                return ret
    
            return render(request, 'login.html')

      cookie在django的使用方式

        1.设置cookie

          1)获取httpresponse对象ret ,一般在login函数中获取

          2)ret.set_cookie(key,value) ,设置cookie

          3)使用装饰器帮忙去每个函数验证cookie是否存在request.COOKIES.get(key)

          4)设置cookie的超时时间ret.set_cookie(key,value,max_age=10) ,设置10秒后超时

          5)仅针对某个url设置cookie ,ret.set_cookie(key,value,path='/app01/addpress')

        2.删除cookie (注销功能)

          ret.delete_cookie('authck')  删除cookie中的一个键值对

    #前端设置注销按钮
    
    ##
    #urls.py
    url(r'logout/', views.logout),
    #views.py
    def logout(request):
        ret = redirect('/app01/login2/')
        ret.delete_cookie('authck')
        return ret

    4.什么是session

      session与cookie类似都是键值对 ,但是session为了安全保存在了服务器 ,把sessionid放入cookie给客户端存储 ,每次客户端访问服务器 ,服务器根据cookie中存储的sessionid来判断用户

      django中使用了一个db表存储session信息django_session表

        session_key字段存储客户端的sessionid

        session_data存储加密的客户端数据

        expire_date存储这条session记录过期时间 (可以通过设置变更)

    5. 登录功能封装session

      与cookie的唯一区别是 ,将session放在了request对象中 ,cookie放在了response对象中 ,就算session放入了request对象中 ,客户端也会接收到cookie存储了sessionid

    ##装饰器修改 ,从request中获取session
    def wrap1(func):
        def inner(request, *args, **kwargs):
            # if request.COOKIES.get('user'):
            if request.session.get('auth'):
                ret = func(request, *args, **kwargs)
                return ret
            # 保留用户记录 ,拼接到地址上
            nowurl = request.path_info
            return redirect(reverse('tlogin') + '?next={}'.format(nowurl))
    
        return inner
    
    ##登录函数使用在request对象中创建了一个字典
    class tlogin(View):
    
        def get(self, request):
            if request.COOKIES.get('user'):
                return redirect(reverse('presslist'))
            return render(request, 'login.html')
    
        # 要在post请求中处理跳转 ,因为只有登录成功才能跳转用户记录
        def post(self, request):
            user = request.POST.get('user')
            password = request.POST.get('password')
            if models.Author.objects.filter(name=user, password=password):
                url = reverse('presslist')
                next = request.GET.get('next')
                if next:
                    url = next
                ret = redirect(url)
                # 在response对象中封装cookie ,下次客户端会带过来
                # ret.set_cookie('user', 'auth')
                request.session['auth'] = 'user'
                return ret
    
            return render(request, 'login.html')

       django中使用session与操作字典相同

        request.session.get(key)          #获取到session

        request.session.set_expiry(time)  #设置session超时时间

        request.session.flush()      # 删除该回话浏览器与服务器的信息 ,与cookie相同做注销使用

      查看session和配置session 

        from django.conf import global_settings      #点击global_settings可以查看修改

    1.session存储方式

      数据库session(默认)     SESSION_ENGINE
    = 'django.contrib.sessions.backends.db'   cache存储session (redis memcache)     SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎     SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置   缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' 2.session其他通用设置 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,默认修改之后才保存(默认)

      

  • 相关阅读:
    C++指针和引用及区别
    C/C++中extern关键字总结
    php进阶面试题总结
    算法疑难(js实现)---11、字典树
    Trie|如何用字典树实现搜索引擎的关键词提示功能
    ExtJS表格——行号、复选框、选择模型
    Ext.js 中 25种类型的Ext.panel.Tool
    Ext NumberField使用
    [ext]form.submit()相关说明
    ExtJS 表单 submit时错误处理
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11419470.html
Copyright © 2020-2023  润新知