• 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
      host:www.baidu.com
      user-agent:Chrome
      
      ')
      	send('POST /index/http1.1
      host:www.baidu.com
      user-agent:Chrome
      
      username=alex&pwd=123')
      	响应:响应头+响应体
      		Content-Encoding:gzip
      Cache-Control:private
      
      网页看到的HTML内容
      扩展:
      	常见的请求头都有哪些?
      	-user-agent:用什么浏览器访问的网站
      	-content-type:请求体的数据格式是什么?(服务端按照格式要求进行解析)
      	常见的请求方式:
      	-GET
      	-POST
      	请求头直接用一个
      相连
      	请求体之间用
      
      相连
      
      
      
    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
          
          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可以做登录之外,还可以做什么?
          

        相关代码:

        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=" 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的网页中查看
          
  • 相关阅读:
    Java中的 多线程编程
    Python中的字典详解
    Python中的数据类型
    Python中的字符串操作总结(Python3.6.1版本)
    R语言绘制沈阳地铁线路图
    HIVE中的order by操作
    Hive中order by,sort by,distribute by,cluster by的区别
    HDFS shell命令
    HDFS入门
    Bootstrap_Datatable Ajax请求两次问题的解决
  • 原文地址:https://www.cnblogs.com/-777/p/11636772.html
Copyright © 2020-2023  润新知