django之cookie,session相關

  1. 裝飾器(加入functools.wraps裝飾,保留函數的元數據--函數名/註釋)css

    1.1 orm字段中的verbose_namehtml

    目前當註釋用
    之後:在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協議redis

    超文本傳輸協議
    關於鏈接:一次請求一次響應以後斷開鏈接(無狀態,短鏈接)
    關於格式:
     請求:請求頭+請求體(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. 案例:博客系統django

    用戶名和密碼檢測
    xxxx.first()#返回對象或者None
    xxxx.exists()#返回布爾值
    
    模板查找順序
     根目錄templates
     根據app註冊順序去每一個app的templates中找
    • 基本實現用戶登陸bootstrap

    • 用戶未登陸就不能訪問指定頁面api

      • 基於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
        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:
                # 用戶登陸成功
                result = redirect('/index/')
                result.set_cookie('xxxxxxxx',user)
                return result
        
            # 用戶名或密碼輸入錯誤
            return render(request,'login.html',{'error':'用戶名或密碼錯誤'})
        
        
        def index(request):
            """
            博客後臺首頁
            :param request:
            :return:
            """
            user = request.COOKIES.get('xxxxxxxx')
            if not user:
                return redirect('/login/')
        
            return render(request,'index.html',{'user':user})

        應用場景:用戶認證,投票,每頁默認顯示數據cookie

        保存在用戶瀏覽器端的鍵值對,向服務端發請求時會自動攜帶。
        Cookie能夠作登陸以外,還能夠作什麼?

      相關代碼:

      models

      from django.db import models
      
      # Create your models here.
      class UserInfo(models.Model):
          username = models.CharField(verbose_name='用戶名',max_length=32)
          password = models.CharField(verbose_name='密碼',max_length=64)
      
      class Blog(models.Model):
          title = models.CharField(verbose_name='標題',max_length=32)
          content = models.TextField(verbose_name='博客園內容')
          author = models.ForeignKey(verbose_name='做者',to=UserInfo)

      urls

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

      views

      from django.shortcuts import render,HttpResponse,redirect
      from app01 import models
      # Create your views here.
      def login(request):
          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()
          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):
          return render(request,'index.html')

      templates

      index.html
      示例:
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>歡迎{{ request.session.user_name }}使用博客後臺</h1>
      </body>
      
      </html>
      </body>
      
      </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>
      • 基於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的網頁中查看
相關文章
相關標籤/搜索