python 学习笔记十九 django深入学习四 cookie,session
缓存
一个动态网站的基本权衡点就是,它是动态的。 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面。当程序访问量大时,耗时必然会更加明显,这就是需要缓存的地方,缓存一些东西是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源。
Django自带了一个健壮的缓存系统来让你保存动态页面这样避免对于每次请求都重新计算。方便起见,Django提供了不同级别的缓存粒度:你可以缓存特定视图的输出、你可以仅仅缓存那些很难生产出来的部分、或者你可以缓存你的整个网站。
Django支持 开发调试,内存,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失效策略。
实例:
# viewsfrom 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": # 设置sessionrequest.session['is_login'] = True# 可以设置多个值 request.session["username"] = usernamereturn redirect('/index/') return render(request, "login.html") def logout(request):#删除sessiondel 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>
View Code
扩展:Session用户验证
def login(func):def wrap(request, *args, **kwargs):# 如果未登陆,跳转到指定页面if request.path == '/test/':return redirect('http://www.baidu.com')return func(request, *args, **kwargs)return wrap
cookie操作:
1.设置cookie
1 request.COOKIES['key'] 2 request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 3 参数: 4 default: 默认值 5 salt: 加密盐 6 max_age: 后台控制过期时间
2.获取cookie
1 rep = HttpResponse(...) 或 rep = render(request, ...) 2 3 rep.set_cookie(key,value,...) 4 rep.set_signed_cookie(key,value,salt='加密盐',...) 5 参数: 6 key, 键 7 value='', 值 8 max_age=None, 超时时间 9 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) 10 path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 11 domain=None, Cookie生效的域名 12 secure=False, https传输 13 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
1 <script src='/static/js/jquery.cookie.js'></script> 2 $.cookie("list_pager_num", 30,{ path: '/' });
django 用户认证
使用session或者cookie验证,需要在每一个views都需要修改源代码添加验证机制,我们可以用到装饰器。django提供了用户验证的方法和验证用户登录的装饰器。
django提供了authentication,log,logout,login_required的方法:
Authenticating users
from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None:# the password verified for the userif user.is_active:print("User is valid, active and authenticated")else:print("The password is valid, but the account has been disabled!") else:# the authentication system was unable to verify the username and passwordprint("The username and password were incorrect.")
login
from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:if user.is_active:login(request, user)# Redirect to a success page.else:# Return a 'disabled account' error message ...else:# Return an 'invalid login' error message....
logout
from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.
login_required
在需要验证登录的views函数上添加login_required
from django.contrib.auth.decorators import login_required@login_required def my_view(request):...
实例:
views
from django.shortcuts import render,HttpResponseRedirect from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login, logout # Create your views here. @login_required def index(request):return render(request, 'index.html')def acc_login(request):if request.method == 'POST':print(request.POST)user = authenticate(username=request.POST.get('username'),password=request.POST.get('password'))if user is not None:# pass authentication login(request, user)return HttpResponseRedirect('/')else:login_err = "Wrong username or password!"return render(request, 'login.html', {'login_err': login_err})return render(request, 'login.html')def acc_logout(request):logout(request)return HttpResponseRedirect('/')
View Code
urls
from django.conf.urls import include, url from django.contrib import admin from app01 import views urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^$', views.index),url(r'^accounts/login/$', views.acc_login),url(r'^accounts/logout/$', views.acc_logout), ]
View Code
html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title></title> </head> <body> <h1> Oldboy CRM</h1>{% block page-container%} Welcome To Oldoby CRM <div> {% if request.user.is_authenticated %} <span>{{ request.user.userprofile.name }}</span> {% else %} <span>登陆/注册</span> {% endif %} </div><a href="/accounts/logout/">退出系统</a>{% endblock %} </body> </html>
View Code
{% extends 'index.html' %} {% block page-container %} <form action="" method="post">{% csrf_token %} Username:<input type="text" name="username"> Password:<input type="password" name="password"> <input type="submit" value="Log me in"> <div>{% if login_err %}<p style="color: red">{{ login_err }}</p>{% endif %} </div> </form>{% endblock %}
login
参考链接:https://docs.djangoproject.com/en/1.9/topics/auth/default/#how-to-log-a-user-out
Ajax
1、单条数据提交
html
<form action="/user_list/" method="post"><input type="button" onclick="Ajaxsubmit();" value="提交"/><table><thead><tr><th>主机名</th><th>端口</th></tr></thead><tbody><tr><td>1.1.1.1</td><td>80000</td></tr><tr><td>1.1.1.1</td><td>80000</td></tr></tbody></table></form><script type="text/javascript" src="/static/jquery-2.2.1.min.js"></script><script>function Ajaxsubmit(){var host = '1.1.1.1';var port = '8000';$.ajax({url:"/ajax_data/",type:'POST',data:{h:host,p:port}, success:function(arg){}})}</script>
ajax
jquery代码:
function Ajaxsubmit(){var host = '192.168.1.100'; var port = '8000'; $.ajax({url:"/ajax_data/", #目标URLtype:'POST', #请求方式data:{h:host,p:port},success:function(arg){console.log(arg)} })}
urls
url(r'^ajax_data/', views.ajax_data),
View Code
views
def ajax_data(request):print request.POSTreturn HttpResponse('OK')
View Code
2、ajax多条数据提交
在原来的基础上修改Jquery,jquery代码:
<script>function Ajaxsubmit(){var array_users = [{'username':'koka','arg':18},{'username':'akok','arg':18},{'username':'kako','arg':18},];$.ajax({url:"/ajax_mdata/",type:'POST',# 以原生的模式传过去tradition: true, #把数组json序列化转成字符串 data:{data:JSON.stringify(array_users)},success:function(arg){var callback_dict = $.parseJSON(arg);//json反序列化把字符串转换为对象 if(callback_dict){alert('提交成功') }else{ alert(callback_dict.error) }}})}</script>
urls
url(r'^ajax_mdata/$', views.ajax_mdata),
View Code
views
import jsondef ajax_data(request):ret = {'status':True,'error':''}try:print request.POSTexcept Exception,e:ret['status'] = Falseret['error'] = str(e)#在上面如果他出错我就把他ret[status] = Falsereturn HttpResponse(json.dumps(ret))
View Code
更多内容见:
http://www.cnblogs.com/wupeiqi/articles/5246483.html
http://www.cnblogs.com/luotianshuai/p/5278175.html
转载于:https://www.cnblogs.com/koka24/p/5496225.html
python 学习笔记十九 django深入学习四 cookie,session相关推荐
- Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法
Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...
- Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效
之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...
- 【theano-windows】学习笔记十九——循环神经网络
前言 前面已经介绍了RBM和CNN了,就剩最后一个RNN了,抽了一天时间简单看了一下原理,但是没细推RNN的参数更新算法BPTT,全名是Backpropagation Through Time. [注 ...
- 乐优商城学习笔记十九-商品详情(二)
2.页面静态化 2.1.简介 2.1.1.问题分析 现在,我们的页面是通过Thymeleaf模板引擎渲染后返回到客户端.在后台需要大量的数据查询,而后渲染得到HTML页面.会对数据库造成压力,并且请求 ...
- javascript学习笔记(十九) 节点的操作
包括节点的创建.添加.移除.替换.复制 本节要用到的html例子 1 <ul id="myList"> 2 <li>项目一</li> 3 < ...
- 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)
概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...
- angular学习笔记(十九)-自定义指令修改dom
使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directiv ...
- IOS学习笔记十九NSArray和NSMutableArray
1.NSArray NSArray不可变集合,不能添加新元素和删除已有元素和替换元素 2.demo Dog.h #import <Foundation/Foundation.h> #ifn ...
- 最优化学习笔记(十九)——拟牛顿法(5)BFGS算法
一.BFGS算法的更新公式 为了推导BFGS算法,需要用到对偶或者互补的概念,前边已经讨论过hessian矩阵逆矩阵的近似矩阵需要满足以下条件: Hk+1Δg(i)=Δx(i)0≤i≤k \bolds ...
最新文章
- MySQL服务器的构建与维护
- CentOS 初体验十七:Nexus发布仓库和引用
- 从上千篇论文脱颖而出,支付宝论文凭什么获得WWW2020评委认可?
- 服装企业信息化计算机化的趋势,服装企业信息化建设的研究.pdf
- python测试驱动开发 中文版_GitHub - starryrbs/python_tdd: 使用Python测试驱动开发完成Django项目...
- document.write vs document.getElementById
- 百度强化学习之Policy learning
- vs查询mysql返回数据_vs与数据库连接查询
- python输入两个坐标求距离_python计算两个地址之间的距离方法
- 推荐FPGA入门书籍
- linux环境搭建之tftp tftpd服务器
- 通用时与儒略日代码解析
- ALexa网站排名查询
- 打通云主机实现局域网
- 哈哈,电驴资源 的下载问题
- round,floor与ceil函数,abs,real与imag函数
- python课程设计矩阵对角线之和_Python二维数组实现求出3*3矩阵对角线元素的和示例...
- 发布网站ASP.NET(ASPX)
- 3d地球散点图加路径lines3D的实现,带有散点即路径的立体地球
- 【DKN】(五)attention.py
热门文章
- 图解远程版本库开发周期 —— Git 学习笔记 22
- hosts文件与resolv.conf文件
- 单向环形列表及应用场景(约瑟夫环)
- C语言再学习-- readelf、objdump、nm使用详解
- OpenCV4.0+VS2017完整安装配置过程(详细!)
- volatile关键字到底做了什么?
- OPTEETrusted Application结构分析
- 【问链-EOS公开课】第十四课 EOS从单签名到多签名
- 深入理解Fabric环境搭建的详细过程
- oracle函数 case,oracle的case函数和case控制结构 (摘)