阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

高阶应用-缓存

211次阅读
没有评论

共计 4694 个字符,预计需要花费 12 分钟才能阅读完成。

一、原因

对于一个中等流量网站,尽可能地减少开销是很有必要的。缓存数据就是为了保护那些需要很多计算资源的结果,这样就不必在下次重新消耗资源进行计算

二、缓存系统工作原理

对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容

三、缓存的好处

  • 减轻服务器的压力
  • 提供良好的用户体验

四、缓存的方式

  • 缓存在数据库中

    • 配置 settings.py

      # 添加缓存配置
      CACHES = {'default':{'BACKEND':'django.core.cache.backends.db.DatabaseCache',
      'LOCATION':'my_cache_table',
      'OPTIONS':{'MAX_ENTRIES':'10', # 缓存数据的最大条数 超出则自动清除
      },
      'KEY_PREFIX':'cache', # 缓存前缀
      }
      }
    • 生成缓存所需要的缓存表

      python manage.py createcachetable [table_name]

      python manage.py createcachetable my_cache_table

  • 缓存在内存中

    配置 settings.py

    # 配置缓存在内存中
    CACHES = {'default':{'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
    }
    }
  • 缓存在文件中

    CACHES = {'default':{'BACKEND':'django.core.cache.backends.filebased.FileBasedCache',
    'LOCATION':r'C:\Users\xlg\Desktop\cache',
    }
    }
  • 缓存在 redis 中

    • 安装第三方扩展库

      pip install django-redis

    • 配置

      # 缓存在 redis 中
      CACHES = {'default':{'BACKEND':'django_redis.cache.RedisCache',
      'LOCATION':'redis://127.0.0.1:6379/1'
      }
      }

五、单个视图缓存

cache_page 装饰器的参数:

  • time 秒 过期的时间
  • cache 缓存配置 默认为 default
  • key_prefix 缓存的前缀
from django.views.decorators.cache import cache_page
# 缓存的使用
@cache_page(10)
def test_filter(req):
print('你能看到我几次')
u = User.objects.all()
return render(req,'show_data.html',{'u':u})

六、底层缓存 API

  • 导入

    from django.core.cache import cache

  • 缓存操作

    • 设置

      cache.set(key,value,expires)

    • 获取

      cache.get(key)

    • 删除

      cache.delete(key)

    • 清空

      cache.clear()

  • 示例

    from django.core.cache import cache
    from django.template import loader
    def my_cache(req):
    res = cache.get('user')
    if not res:
    u = User.objects.all()
    tem = loader.get_template('show_user.html')
    res = tem.render({'u':u})
    cache.set('user', res, 60)
    return HttpResponse(res)

七、缓存案例

settings.py 配置

# 缓存在 redis 中
CACHES = {'default':{'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}

视图函数

def register(req):
if req.method == 'GET':
return render(req, 'register.html')
elif req.method == 'POST':
username = req.POST.get('username')
userpass = req.POST.get('userpass')
email = req.POST.get('email')
if cache.get(username):
return HttpResponse('该账户已存在')
else:
# 设置 None 为永远不过期
cache.set(username,userpass, None)
return HttpResponse('成功')
def Login(req):
if req.method == 'GET':
return render(req, 'login.html')
elif req.method == 'POST':
username = req.POST.get('username')
userpass = req.POST.get('userpass')
email = req.POST.get('email')
password = cache.get(username)
if password and password == userpass:
return HttpResponse('登录成功')
else:
return HttpResponse('请输入正确的用户名或密码')

登录 / 注册模板

<!DOCTYPE html>
<html>
<head>
<title> 登录页面 </title>
<style>
.pg_header{position: fixed;
height: 48px;
top: 0;
left: 0;
right: 0;
background-color: #2459a2;
line-height: 48px;
}
.pg_header .logo{margin: 0 auto;
float: left;
width: 200px;
text-align: center;
line-height: 48px;
font-size: 28px;
color: white;
}
.pg_dl{left: 400px;
display: inline-block;
padding: 0 40px;
color: white;
}
.pg_header .pg_dl:hover{background-color: #2459fb;
cursor: pointer;
}
.left{margin-top: 20px;
width: 400px;
display: inline-block;
float: left;
}
.pg_body{margin-top: 50px;
font-size: 18px;
display: inline-block;
width: 200px;
}
.pg_body .menu{width: 800px;
padding: 15px;
float: left;
font-weight: bold;
}
input[type="text"]{width: 200px;
height: 25px;
border-radius: 6px;
}
input[type="password"]{width: 200px;
height: 25px;
border-radius: 6px;
}
input[type="button"]{background-color: #555555;
border: none;
color: white;
padding: 12px 29px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 17px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
input[type="submit"]{background-color: #555555;
border: none;
color: white;
padding: 12px 29px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 17px;
margin: 4px 2px;
cursor: pointer;
border-radius: 4px;
}
.kong{margin-top: -54px;
margin-left: 200px;
float:left;
padding: 15px;
}
.img{width: 50px;
height: 40px;
}
.can{width: 1220px;
height: 40px;
line-height: 40px;
margin: 0 auto;
text-align: center;
display: inline-block;
}
.tian{color: red;
float: right;
font-size: 12px;
margin-right: -120px;
margin-top: -25px;
}
</style>
</head>
<body id="i88" style="margin: 0">
<div class = "pg_header">
<a class = "logo">LOGO</a>
<a class="pg_dl" id="i77"> 登录 </a>
</div>
<form name="tijiao" method="post" onsubmit="return check()" action="{% url'App:login'%}">
{% csrf_token %}
<div class="left"></div>
<div class="pg_body">
<div class="menu"> 用户名:</div>
<div class="kong">
<input id="text1" type="text" name="username" placeholder="请输入用户名"><span id="div1" class="tian" style="margin-top: 4px">*(为必填)</span>
</div>
<div class="menu"> 密码:</div>
<div class="kong">
<input id="text2" type="password" name="userpass" onblur="check()">
<span id="div2" class="tian" style="margin-top: 5px">*(为必填)</span>
</div>
</div>
<div class="can">
<input id="i111" type="submit" name="002" value="登 录">
<p style="width: 200px;display: inline-block;"></p>
<input id="i222" type="button" name="004" value="取 消">
</div>
</form>
</body>
</html>

路由地址

from django.urls import path
from App.views import *
urlpatterns = [path('', main.index, name='index'),
path(r'login/', main.Login, name='login'),
path(r'register/', main.register, name='register'),
]

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计4694字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中