2.django笔记之缓存,session,cookie,ajax

一、django缓存

1.缓存

缓存的意义在于把昂贵的计算结果保存起来一遍下次的访问,有缓存的站点的流程大概是这样子的:

给定一个url,检查页面是否在缓存中
如果在,返回缓存的页面
否则,生成该页面,把生成的页面保存在缓存中,返回生成的页面

最常见的就是传说中的CDN(内容分发网络)

这样可以减少用户频繁请求源站或者django站点数据。导致性能,访问速度等损耗。

django自带一个强大的缓存系统,提供不同层次的缓存粒度:你可以缓存某个视图函数的输出,或者只是某个特别难生成的部分或者是整个站点。同时django也有类似“上流”缓存的东西,类似于Squid和基于浏览器的缓存,这类缓存是你无法直接控制但是你可以通过一些提示(比如http头部)指定你网站的那些部分需要和如何缓存。

django支持mysql,Redis、Memecache、文件的方式做缓存,并且可以设置超时时间。

2.基本配置(基于文件系统缓存)

1)首先先创建一个django工程

#django-admin startproject cache
#cd cache

2)创建一个app

#python manage.py startapp cache01(你app的名字)

3)注册app

#vim cache/settings.py(修改你工程的settings文件)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cache01',	//你app的名字
]

4)添加urls

#vim cache/urls.py(修改你工程的路由文件)
配置如下:
from django.conf.urls import url
from django.contrib import admin
from cache01 import views #导入app的views函数
urlpatterns = [
    url(r'^admin/', admin.site.urls),
#设置当用户访问ip:端口/time时候使用这个函数
    url(r'time/',views.shijian),	
]

5)实现shijian函数

#vim cache01/views.py (你app的views文件)
代码如下:

from django.shortcuts import render,HttpResponse

# Create your views here.
#导入时间模块
import time

def shijian(request):
	return HttpResponse(time.time())

6)测试访问

访问结果应该是时间戳
每次刷新结果都是不一样的,都是实时的时间。

7)设置缓存

在工程的settings里设置如下:

CACHES = {
'default': {
    #定义已文件的方式进行cache
    'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
    #cachebak文件的存放路径 正常来说都是cache 但是我的工程名字用了cache
	#所以用了cachebak
    'LOCATION': os.path.join(BASE_DIR, 'cachebak'),
    #超时时间为600妙
    'TIMEOUT': 600,
    'OPTIONS': {
        'MAX_ENTRIES': 1000
    }
}
}

8)对urls设置缓存(使用装饰器)

在app下面的views.py文件里
配置如下:

from django.shortcuts import render,HttpResponse
from django.views.decorators.cache import cache_page
# Create your views here.
import time
@cache_page(60 * 15) #设置缓存时间,当超过这个时间,请求会从views里取数据,
def shijian(request):
	return HttpResponse(time.time())

9)测试访问:

发现时间戳已经被缓存。

而且工程目录下会多出一个cachebak目录存放缓存数据

3.其他方式缓存

1)memached缓存

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载从而显著提供网站性能,也是django中到目前为止最有效率的可用缓存。

使用memcached缓存需要安装在安装python-memcached和pylibmc。一般使用python-memcached就可以。

在django中使用Memcached,你需要在配置文件里的CACHES做如下设置:

根据你选择的插件,选择对应的后端(BACKEND),
django.core.cache.backens.memcached.MemcachedCache或者
django.core.cache.backends.memcached.PyLibMCCache
给LOCATION设置ip:port值,
其中ip是Memcached进程的IP地址,
port是Memcached运行的端口,
或者unix:path值,
其中path是Memcached Unix socket文件所在的路径

配置如下:

在settings里设置

CACHES = {
 'default': {
#设置缓存插件
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
 #使用了三个端口的服务来存入缓存。
  '115.29.51.8:11211',
  '115.29.51.8:11211',
  '115.29.51.8:11213',
]
}
}

缓存完全在内存中,一旦服务器崩溃,所有的数据将不复存在,因此,不要把基于内存的缓存作为你唯一的数据存储方式,

2.数据库方式缓存

1.创建一个存放数据库的表结构

python manage.py createcachetable [(你的缓存表名字)]

2.修改工程的settings文件
配置如下:

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
	#LOCATION对应的你是在数据库中的表名
    'LOCATION': '我的缓存表名字',
}

3.本地内存缓存

工程的settings文件里配置如下:

CACHES = {
'default': {
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    'LOCATION': 'unique-snowflake'
}
}
多线程和线程安全的哦、。。。。

先介绍这么多,基本够使用啦。以后再说咯、

二、session和cookie

1.作用

当你要登录京东和天猫的时候,当登录成功的时候。我点击其他功能例如购物车 订单等功能的时候
是如何判断你已经登录的呢。那就是用的cookie或者session功能。

2.区别

cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

3.结构

1、自动生成一段字符串

2、将字符串发送到客户端的浏览器,同时把字符串当做key放在session里。(可以理解为session就是一个字典)

3、在用户的session对应的value里设置任意值

(来自罗天帅)

4.session基本操作

1)操作

1、设置Sessions值
request.session['session_name'] ="admin"
2、获取Sessions值
session_name = request.session["session_name"]
3、删除Sessions值
del request.session["session_name"]
4、检测是否操作session值
if "session_name" is request.session :
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

2)工程配置

1、编辑settings.py中 MIDDLEWARE_CLASSES 配置, 
确保 'django.contrib.sessions.middleware.SessionMiddleware'存在,如果没有则添加。
2、编辑settings.py中INSTALLED_APPS 配置,确保'django.contrib.session

3)sessions规则:

1、session是以字典方式存储,
(Key—>Value的键值对方式存储),
访问是只要访问Session的键就可以得到键对应的Value:value = request.session["key_name"]
2、Session字典中以下划线开头的key值是Django内部保留key值。
框架只会用很少的几个下划线开头的session变量,
3、不要用一个新对象来替换掉 request.session,也不要存取其属性、
4、Session储存在服务器端,
优点:数据存储相对比较安全,数据交换方便。
缺点:如果存储数据多,访问量大时,比较消耗服务器端资源,导致网站整体性能下降。

5.cookie基本操作

1)操作cookie

1、设置Cookies	
 response.set_cookie("cookie_key","value")
2、获取Cookies
 value = request.COOKIES["cookie_key"]
3、删除Cookies
 response.delete_cookie("cookie_key",path="/",domain=name)
4、检测Cookies
 if "cookie_name" is request.COOKIES :
5、response.set_cookie() 传递一些可选的参数 描述

4.实例(基于cookie的登录)

1.创建工程

# sudo django-admin startproject demo

2.创建app和注册app

#cd demo
#sudo python3 manage.py startapp index
#打开工程的settings.py文件里,注册app
#vim demo/settings.py
如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',		#写上你app的名字
]

3.修改urls

#修改工程的urls.py 让urls指向app的urls.py
#vim demo/urlsy.py 配置如下:
	from django.conf.urls import url
	from django.contrib import admin
	from index import  views
urlpatterns = [
	url(r'^admin/', admin.site.urls),
	url(r'^index/', views.index),#首页函数
	url(r'^login/', views.login),#登录函数
	url(r'^layout/', views.layout),#登录函数
]

4.创建index页面

#在templates里创建index.html
#index页面就是显示登录的后的内容的	
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>欢迎{{ username }}登录</h1>
</body>
</html>

5.创建登录页面

#在templates里创建login.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>

6.创建登录和index函数

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect

# Create your views here.
def index(request):
	#从请求里获取usernamecoolie
	#首先判断存不存在cookie,如果不存在跳转到login页面
	username = request.COOKIES.get('username','') #获取cookie
	if len(username) == 0: 	#如果为0 那么没有用户名cookie
	    print(username)		
	    return render(request,'login.html')	#跳转到登录页面
	else:
	    print(username)			#如果有用户名,将用户名传入index页面
	    return render(request,'index.html',{'username':username})
def login(request):
	if request.method == 'POST':
	    username = request.POST.get('username')
	    password = request.POST.get('password')
	    response = HttpResponseRedirect('/index/')	
	    #将username写入浏览器cookie,失效时间为3600
	    response.set_cookie('username',username,3600)	
	    return  response

#-------------删除cookie-------此功能没加--------------
def logout(request):
	response = HttpResponse('logout !!')
	#清理cookie里保存username
	response.delete_cookie('username')
	return response
#----------自行使用------------------------------------

5.实例(基于session的登录)

此步骤和上面cookie步骤一样,

就写函数操作实例

views代码如下:

from django.shortcuts import render,HttpResponseRedirect
# Create your views here.

def index(request):
	#从请求里获取username session
	#首先判断存不存在session,如果不存在跳转到login页面
	username = request.session.get("username")
	print(username)
	if username == None:
	    print(username)
	    return render(request,'login.html')
	else:
	    print(username)
	    return render(request,'index.html',{'username':username})
def login(request):
	if request.method == 'POST':
	    username = request.POST.get('username')
	    password = request.POST.get('password')
		#设置session
	    request.session['username'] =username
	    return  HttpResponseRedirect('/index/')

#删除session-----------------------适用于退出功能
def logout(request):
	del request.session["session_name"]

注:session需要写入数据库,所以需要初始化数据库。

1.python manage.py makemigrations
2.python manage.py mirate
3.运行

三、ajax发送数据

1.一条数据

html页面如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/提交的函数/" method="post">
    <input type="button" onclick="add();" value="提交到后台"/>
</form>
<script type="text/javascript" src="/static/jquery-2.2.3.min.js"></script>
<script>
    function Ajaxsubmit(){
        var host = '115.29.51.8';
        var port = '8000';
        $.ajax({
            url:"/接受请求的函数地址/",
            type:'POST',
            data:{h:host,p:port},
            success:function(arg){
{#                    #arg为后端返回的字符串#}
            }
        })
    }
</script>
</body>
</html>
#ajax发送代码

$.ajax({
            url:"/接受请求的函数地址/",
            type:'POST',#请求类型
            data:{h:host,p:port},
            success:function(arg){
			{#                    #arg为后端返回的字符串#}
            },
            error:{
              #如果没有返回 此处可以定义错误信息
			  #比如时间超时  
            }
        })
    }

2.多条格式化字符串发送

1.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/提交的函数/" method="post">
    <input type="button" onclick="add();" value="提交到后台"/>
</form>
<script type="text/javascript" src="/static/jquery-2.2.3.min.js"></script>
<script>
    function add(){
        var data = [
            {'host':'115.29.51.8','port':8000},
            {'username':'liuyao','age':18}
            ];
        $.ajax({
            url:"/接受数据的url/",
            type:'POST',
            tradition: true,
            data:{data:JSON.stringify(data)}, //使用json将数据转成字符串
            success:function(arg){
                alert('arg')
            }
        })
    }
</script>
</body>
</html>

2.后端的url

使用json loads方法将字符串转成字典进行判断

import json

def urls(request):
	info = json.loads(request.POST['data'])
	print (info)

四、django的请求生命周期

首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端

流程图如下:

posted @ 2016-05-23 22:34  刘耀  阅读(1575)  评论(1编辑  收藏  举报