zoukankan      html  css  js  c++  java
  • 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,默认修改之后才保存(默认)

      

  • 相关阅读:
    WP7 操作XML文件
    C#和C/C++指针实现swap交换
    感受
    我学到了什么 我思考了什么.
    hdu 2768 Cat vs. Dog (最大独立)
    hdu 1960 Taxi Cab Scheme (最小覆盖)
    hdu 1528 Card Game Cheater (最小覆盖)
    hdu 4160 Dolls (最大独立)
    hdu 2458 Kindergarten (最大独立集)
    hdu 2119 Matrix (最小覆盖)
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11419470.html
Copyright © 2011-2022 走看看