zoukankan      html  css  js  c++  java
  • drf版本控制redis基础

    内置的版本控制类

    from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning

    基于url的get传参方式:QueryParameterVersioning      如:/user?version=v1

    基于url的正则方式:URLPathVersioning              /v1/user/

    基于accept请求头方式:AcceptHeaderVersioning    Accept:application/json;version=1

    基于主机名方法:HostNameVersioning       v1.example.com

    基于django路由系统的namespace:NamespaceVersioning       example.com/v1/users/

    局部使用

    在CBV类中加入

    versioning_class = URLPathVersioning

    全局使用

    REST_FRAMEWORK = {'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',

    'DEFAULT_VERSION':'v1',   默认版本(request中无法取到)

    'ALLOWED_VERSIONS':['v1','v2'],    (允许的版本)

    'VERSION_PARAM':'version'}   URL中获取值的key

    基于正则的方式:

    from django.conf.urls import url,include

    from web.views import TestView

    urlpatterns = [ url(r'^(?P<version>[v1|v2]+)/test/',TestView.as_view(),name='test'),]

    获取版本: request.version

    获取版本管理的类:  request.versioning_scheme

    源码分析

    执行determine_version,返回两个值,放到request对象里

    version,scheme =self.determine_version(request,*args,**kwargs)

    request.version,request.versioning_scheme = version,scheme

    def determine_version(self,request,*args,**kwargs):

      if self.versioning_class is None:

        return (None,None)

      scheme =self.versioning_class()

      return (scheme.determine_version(request,*args,**kwargs),scheme)

    django缓存

    为了提高网站并发量

    三种粒度;

      全站缓存,单页面缓存,页面中布局缓存

    6中缓存机制

    django中使用缓存

    第一步:在settings中配置(缓存方式),已缓存到文件举例

      CACHE= {'default':{'BACKEND':'django.core.cache.backends.filebased.FileBaedCache',指定缓存使用的引擎

    'LOCATION':'/var/tmp/django_cache', 指定缓存的路径

    'TIMEOUT':300,   缓存超时时间(默认为300秒,None表示永不过期)

    'OPTIONS':{'MAX_ENTRIES':300,'CULL_FREQUENCY':3,}}} 最大缓存的数量300, 缓存到达最大个数之后,剔除缓存个数的比例

    第二部使用缓存

    使用单页面缓存(使用装饰器):

    from django.views.decorators.cache import cache_page

    @cache_page(5)

    def cache_test(request):

      ctime = time.time()

      return render(request,'index.html',locals())

    页面局部缓存

    {% load cache %}

    第一个参数是超时时间,第二个参数是key值,唯一的标志

    {% cache 5 'tt' %}

    {{ ctime }}

    {% endcache %}

    全站缓存:配置中间件

    配置两个中间件:

    django.middleware.cache.UpdateCacheMiddleware'...

    django.middleware.cache.FetchFromCacheMiddleware'

    配置缓存时间

    CACHE_MIDDLEWARE_SECONDS=10

    缓存存储的数据格式

    unique-snowflake={index:regre}

    跨域问题

    同源策略

    浏览器基本的安全策略

    当前页面只能朝当前域的地址发送请求

    不同的域:ip+端口+协议  都相同才是同一个域

    CORS 跨域资源共享

    简单请求和非简单请求

    只要符合以下两条,就是简单请求,否则就是费简单请求

    (1):请求方法是以下三种之一

    HEAD,GET,POST

    (2):HTTP的头信息不超出以下几种字段:

    Accept  Accept-Language  Content-Language  Last-Event-ID

    Content-Type:只限于三个值application/x-www-form-urlencoded,multipart/form-data,text.plain

    简单请求只发一次请求

    费简单请求发两次:一次是OPTIONS预检请求,预检通过再发第二次真实请求,

    以后处理跨域问题(可以使用第三方的django-cors-headers):

    写一个中间件:

    class MyMiddleware(MiddlewareMixin):

    def process_response(self,request,response):

      response['Access-Control-Allow-origin']='*'

      if request.method == 'OPTIONS':

        response['Access-Control-Allow-Headers'] = '*'

      response['Access-Control-Allow-Methods']="*"

      return response

    在settings中配置

    redis

    mysql,oracle:关系型数据库

    redis,mongodb:菲关系型数据库/nosql

    redis存储在内存内  mongodb存储到硬盘上  

    redis一般用来做:

    做缓存

    session数据

    游戏排行榜

    对速度要求比较高的数据的存储

    做消息队列

    redis是key-value的存储,支持持久化,类字典,有五大数据类型:

    字符串:

    列表:

    字典:

    集合:

    有序集合:

    redis = { k1:'123',字符串,可:[1,2,3]列表,k3:{1,2,3}集合,k4:{name:lqz,age:12}字典/hash表,k5:{('lqz',18),('egon',33)有序集合}}

    比较redis和Memcached

    redis支持五大数据类型 redis支持持久化,单进程,单线程,速度非常快

    Memcached不能持久化,只支持字符串

    python操作redis

    安装redis模块

    快速使用

    import redis

    conn = redis.Redis(host='127.0.0.1',port=6379)

    name=conn.get('name')

    redis连接池

    首先新建模块

    import redis

    POOL = redis.ConnectionPool(host='127.0.0.1',port=6379.max_connections=1000)

    使用连接池

    from conn_pool import POOL

    conn = redis.Redis(connection_pool=POOL)

    Django中的6中缓存方式

    开发者调试缓存

    内存缓存

    文件缓存

    数据库缓存

    Memcached缓存(使用python-memcache模块)

    Memcache缓存(使用pylibmc模块)

     1 CACHES = {
     2  'default': {
     3   'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
     4   'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
     5   'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
     6   'OPTIONS':{
     7    'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
     8    'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
     9   }  
    10  }
    11 }
    内存缓存
     1 CACHES = {
     2  'default': {
     3   'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
     4   'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径
     5   'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
     6   'OPTIONS':{
     7    'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
     8    'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
     9   }
    10  }   
    11 }
    文件缓存
     1 CACHES = {
     2  'default': {
     3   'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
     4   'LOCATION': 'cache_table',          # 数据库表    
     5   'OPTIONS':{
     6    'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
     7    'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
     8   }  
     9  }   
    10 }
    11 注意,创建缓存的数据库表使用的语句:
    12 
    13 python manage.py createcachetable
    数据库缓存
    Memcached是Django原生支持的缓存系统.要使用Memcached,需要下载Memcached的支持库python-memcached或pylibmc.
    
    settings.py文件配置
    CACHES = {
     'default': {
      'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', # 指定缓存使用的引擎
      'LOCATION': '192.168.10.100:11211',         # 指定Memcache缓存服务器的IP地址和端口
      'OPTIONS':{
       'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
       'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
      }
     }
    }
    LOCATION也可以配置成如下:
    'LOCATION': 'unix:/tmp/memcached.sock',   # 指定局域网内的主机名加socket套接字为Memcache缓存服务器
    'LOCATION': [         # 指定一台或多台其他主机ip地址加端口为Memcache缓存服务器
     '192.168.10.100:11211',
     '192.168.10.101:11211',
     '192.168.10.102:11211',
    ]
    Memcached缓存
      1 视图:
      2 
      3 复制代码
      4 from django.views.decorators.cache import cache_page
      5 import time
      6 from .models import *
      7 
      8 @cache_page(15)          #超时时间为15秒
      9 def index(request):
     10   t=time.time()      #获取当前时间
     11   bookList=Book.objects.all()
     12   return render(request,"index.html",locals())
     13 复制代码
     14 模板(index.html):
     15 
     16 复制代码
     17 <!DOCTYPE html>
     18 <html lang="en">
     19 <head>
     20     <meta charset="UTF-8">
     21     <title>Title</title>
     22 </head>
     23 <body>
     24 <h3>当前时间:-----{{ t }}</h3>
     25 
     26 <ul>
     27     {% for book in bookList %}
     28        <li>{{ book.name }}--------->{{ book.price }}$</li>
     29     {% endfor %}
     30 </ul>
     31 
     32 </body>
     33 </html>
     34 复制代码
     35 上面的例子是基于内存的缓存配置,基于文件的缓存该怎么配置呢??
     36 
     37 更改settings.py的配置
     38 
     39 复制代码
     40 CACHES = {
     41  'default': {
     42   'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 指定缓存使用的引擎
     43   'LOCATION': 'E:django_cache',          # 指定缓存的路径
     44   'TIMEOUT': 300,              # 缓存超时时间(默认为300秒,None表示永不过期)
     45   'OPTIONS': {
     46    'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
     47    'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
     48   }
     49  }
     50 }
     51 复制代码
     52 然后再次刷新浏览器,可以看到在刚才配置的目录下生成的缓存文件
     53 
     54 通过实验可以知道,Django会以自己的形式把缓存文件保存在配置文件中指定的目录中.
     55 
     56 4.2 全站使用缓存
     57 既然是全站缓存,当然要使用Django中的中间件.
     58 
     59 用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户
     60 
     61 当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存
     62 
     63 复制代码
     64 缓存整个站点,是最简单的缓存方法
     65 
     66 在 MIDDLEWARE_CLASSES 中加入 “update” 和 “fetch” 中间件
     67 MIDDLEWARE_CLASSES = (
     68     ‘django.middleware.cache.UpdateCacheMiddleware’, #第一
     69     'django.middleware.common.CommonMiddleware',
     70     ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
     71 )
     72 “update” 必须配置在第一个
     73 “fetch” 必须配置在最后一个
     74 复制代码
     75 修改settings.py配置文件
     76 
     77 
     78 复制代码
     79 MIDDLEWARE_CLASSES = (
     80     'django.middleware.cache.UpdateCacheMiddleware',   #响应HttpResponse中设置几个headers
     81     'django.contrib.sessions.middleware.SessionMiddleware',
     82     'django.middleware.common.CommonMiddleware',
     83     'django.middleware.csrf.CsrfViewMiddleware',
     84     'django.contrib.auth.middleware.AuthenticationMiddleware',
     85     'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
     86     'django.contrib.messages.middleware.MessageMiddleware',
     87     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     88     'django.middleware.security.SecurityMiddleware',
     89     'django.middleware.cache.FetchFromCacheMiddleware',   #用来缓存通过GET和HEAD方法获取的状态码为200的响应
     90 
     91 )
     92 
     93 
     94 CACHE_MIDDLEWARE_SECONDS=10
     95 复制代码
     96 视图函数:
     97 
     98 复制代码
     99 from django.views.decorators.cache import cache_page
    100 import time
    101 from .models import *
    102 
    103 
    104 def index(request):
    105 
    106      t=time.time()      #获取当前时间
    107      bookList=Book.objects.all()
    108      return render(request,"index.html",locals())
    109 
    110 def foo(request):
    111     t=time.time()      #获取当前时间
    112     return HttpResponse("HELLO:"+str(t))
    113 复制代码
    114 模板(index.html):
    115 
    116 复制代码
    117 <!DOCTYPE html>
    118 <html lang="en">
    119 <head>
    120     <meta charset="UTF-8">
    121     <title>Title</title>
    122 </head>
    123 <body>
    124 <h3 style="color: green">当前时间:-----{{ t }}</h3>
    125 
    126 <ul>
    127     {% for book in bookList %}
    128        <li>{{ book.name }}--------->{{ book.price }}$</li>
    129     {% endfor %}
    130 </ul>
    131 
    132 </body>
    133 </html>
    134 复制代码
    135 其余代码不变,刷新浏览器是10秒,页面上的时间变化一次,这样就实现了全站缓存.
    136 
    137 4.3局部视图缓存
    138 例子,刷新页面时,整个网页有一部分实现缓存
    139 
    140 views视图函数
    141 
    142 复制代码
    143 from django.views.decorators.cache import cache_page
    144 import time
    145 from .models import *
    146 def index(request):
    147      t=time.time()      #获取当前时间
    148      bookList=Book.objects.all()
    149      return render(request,"index.html",locals())
    150 复制代码
    151 模板(index.html):
    152 
    153 复制代码
    154 {% load cache %}
    155 <!DOCTYPE html>
    156 <html lang="en">
    157 <head>
    158     <meta charset="UTF-8">
    159     <title>Title</title>
    160 </head>
    161 <body>
    162  <h3 style="color: green">不缓存:-----{{ t }}</h3>
    163 
    164 {% cache 2 'name' %}
    165  <h3>缓存:-----:{{ t }}</h3>
    166 {% endcache %}
    167 
    168 </body>
    169 </html> 
    缓存的使用
     1 string操作,redis中的string在内存中按照一个name对应一个value来存储
     2 setname,value,ex=None,px=False,xx=False)
     3 在Redis中设置值,默认,不存在则创建,存在则修改
     4 参数:
     5 ex:过期时间(秒)
     6 px:过期时间(毫秒)
     7 nx:如果设置为True,则只有name不存在时,当前set操作才执行,只存在就修改不了,执行没效果
     8 xx:如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在不会设置新值
     9 setnx(name,value)
    10 设置值,只有name不存在时,执行设置操作(添加),如果存在,不会修改
    11 setex(name,value,time)
    12 设置值,参数:time过期时间(数字秒,或timedelta对象)
    13 psetex(name,time_ms,value)
    14 设置值 参数:time_ms过期时间(数字毫秒)
    15 mset(*args,**kwargs)
    16 批量设置值 如:mset(k1='v1',k2='v2')或mget({'k1':'v1','k2':'v2'})
    17 get(name)
    18 获取值
    19 mget(key,*args)
    20 批量获取 mget('k1','k2')  或 mget(['k3','k4'])
    21 getset(name,value)
    22 设置新值并获取原来的值
    23 getrange(key,start,end)
    24 获取子序列(根据字节获取,非字符)
    25 参数:start:起始位置  end 结束位置
    26 setrange(name, offset, value)
    27 
    28 # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
    29 # 参数:
    30     # offset,字符串的索引,字节(一个汉字三个字节)
    31     # value,要设置的值
    32 strlen(name)
    33 
    34 # 返回name对应值的字节长度(一个汉字3个字节)
    35 incr(self, name, amount=1)
    36 
    37 复制代码
    38 # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
    39  
    40 # 参数:
    41     # name,Redis的name
    42     # amount,自增数(必须是整数)
    43  
    44 # 注:同incrby
    45 复制代码
    46 incrbyfloat(self, name, amount=1.0)
    47 
    48 # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
    49  
    50 # 参数:
    51     # name,Redis的name
    52     # amount,自增数(浮点型)
    53 decr(self, name, amount=1)
    54 
    55 # 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
    56  
    57 # 参数:
    58     # name,Redis的name
    59     # amount,自减数(整数)
    60 append(key, value)
    61 
    62  
    63 
    64 # 在redis name对应的值后面追加内容
    65  
    66 # 参数:
    67     key, redis的name
    68     value, 要追加的字符串
    Redis操作
  • 相关阅读:
    PAT(A) 1095. Cars on Campus (30)
    PAT(A) 1080. Graduate Admission (30)
    PAT(A) 1083. List Grades (25)
    Linux 使用create_ap开热点后无法连接wifi问题的解决
    汽车加油行驶问题(最短路)
    孤岛营救问题(最短路 状态压缩)  网络流24题
    软件补丁问题(状态压缩 最短路)
    餐巾计划问题(费用流)
    分配问题(二部图的最佳匹配 KM) 线性规划与网络流24题
    数字梯形问题(费用流)
  • 原文地址:https://www.cnblogs.com/suncunxu/p/10638323.html
Copyright © 2011-2022 走看看