缓存
缓存一些东西是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源。
缓存你的整个网站。
内存,mysql,Redis、Memecache、文件的方式做缓存,并且可以设置超时时间。
设置缓存(基于文件)
settings
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', # 引擎 'LOCATION': os.path.join(BASE_DIR, 'cache'), # cache文件的存放路径 'TIMEOUT': 600, # 缓存超时时间(默认300,None表示永不过期,0表示立即过期) 'OPTIONS': { 'MAX_ENTRIES': 1000 # 最大缓存个数(默认300) } } }
urls
配置如下: from django.conf.urls import url from django.contrib import admin from app01 import views #导入app的views函数 urlpatterns = [ url(r'^admin/', admin.site.urls), #设置当用户访问ip:端口/time时候使用这个函数 url(r'cache/',views.cache_page), ]
views
from django.views.decorators.cache import cache_page from django.shortcuts import render,HttpResponse #这里设置的是 60秒 * 15 ,15分钟之后 @cache_page(60 * 15) def cache_page(request): current = str(time.time()) return HttpResponse(current)
cookie 和 session
Cookie 保存于本地 ,session 保存于服务器;同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,
所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。
区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
工作流程:
当你浏览京东或者天猫的时候,登录成功以后(一次请求),想查看我的订单(另一次请求),但是http是短连接(连接一次就断开),服务器该如何判断你是否登录呢?所以在服务器端需要有一个保存用户状态地方(session),客户端登录成功后,服务端向客户端浏览器写入一段字符串(标识),客户端每次访问的时候需要带上这个标识,服务端根据这个标识就能获取客户端信息了。客户端保存这个标识就叫做cookie。
构成:
1、自动生成一段字符串
2、将字符串发送到客户端的浏览器(cookie),同时把这段字符串当做key放在session里。(可以理解为session就是一个字典)
3、在用户的session对应的value里设置任意值(字典里面可以继续套字典)
session基本操作
- 获取session:request.session[key]
- 设置session:reqeust.session[key] = value
- 删除session:del request.session[key]
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
实例:
# views
from django.shortcuts import render,HttpResponseRedirect # Create your views here. def index(request): #从请求里获取username session #首先判断存不存在session,如果不存在跳转到login页面 is_login = request.session.get("is_login", False)
if is_login:
# 这里可以根据登录的用户显示不同的数据
# username = request.session.get("username")
# retrun render(request,"xxx.html")
return httpResponse("index")
else:
return redirect("/login/")
def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == "koka" and password=="123456":
# 设置session request.session['is_login'] = True
# 可以设置多个值
request.session["username"] = username
return redirect('/index/')
return render(request, "login.html") def logout(request):
#删除session del request.session["session_name"]
return redirect('/login/')
注:session默认用的是数据库,所以需要初始化数据库。
1.python manage.py makemigrations 2.python manage.py mirate
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post">{% csrf_token %} 用户名:<input type="text" name="username"/> 密码:<input type="password" name="password"/> <input type="submit" value="登录"/> </form> </body> </html>