七橼77

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  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
        
        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="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的网页中查看
        
posted on 2019-10-08 17:31  七橼77  阅读(168)  评论(0编辑  收藏  举报