web框架详解之tornado 二 cookie
一、tornado之cookie一
目录:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<a href="/logout">退出</a>
<h1>银行卡余额</h1> </body>
</html>
manager中的代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/login" method="post">
<input type="text" name="username"/>
<input type="password" name="password"/>
<input type="submit" value="登录"/>
<span style="color: red;">{{status_text}}}</span>
</form> </body>
</html>
login代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>首页</h1> </body>
</html>
index代码
#!/usr/bin/env python
# -*- coding:utf- -*- import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
class LogoutHandler(tornado.web.RequestHandler):
def get(self):
self.set_cookie("auth","")
self.redirect("/login")
class managerHandler(tornado.web.RequestHandler):
def get(self):
# 下面是判断,如果key等于value那么就登录到,否则跳转
co=self.get_cookie("auth")
if co=="":
self.render('manager.html')
else:
self.redirect("/login")
class loginHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html',status_text="") def post(self):
username=self.get_argument("username",None)
pwd=self.get_argument("password",None)
if username=="aa"and pwd=="bb":
self.set_cookie("auth","")
self.redirect("/manager")
else:
self.render("login.html",status_text="登录失败")
settings = {
'template_path': 'views',
} # 下面第一个参数是HTML中的参数映射
application = tornado.web.Application([
(r"/index", MainHandler),
(r"/manager", managerHandler),
(r"/login", loginHandler),
(r"/logout", LogoutHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
下面是python代码
设计思想:
首先定义是个类:首页,登录,隐私页面,和退出类
、 登录代码中首先在post中接收用户用户输入的账号密码
、 然后用set_cookie来设置cookie,并且跳转到指定页面,否则就返回登录页面,并且自定义一个参数为登录失败,这个参数 由于在post中设置,所以也要在get方法中去设置
、 在隐私页面中判断,如果cookie等于设置的,那么就可以跳转到这个页面,否则返回去
、 在隐私页面中设置退出,并且修改cookie
方法:
self.set_cookie(“key”,”value”,) 设置cookie
self.get_cookie(“key”,”value”) 获取cookie
self.redirect(“/login”) 跳转
思路

、 用户首先登录login,之后在form中填写内容,进行post提交,提交的时候如果输入的内容和设计的内容相等,那么就会这只cookie的值为1,并且跳转到manager页面。
、 这个时候如果用户没有登录想直接登录manager页面,这个时候就会进行判断设置的cookie,如果不对,那么就会跳转到登录页面。
、 如果用户登录成功就可以登录隐私页面logout页面,在这个里面定义一个退出,如果用户点击这个退出,那么cookie就会被清除
cookie(二)
1、 自动登录
首先在login页面中form中写入
<input type="checkbox" name="auto" value=""/>7天免密码
之后在login类中进行判断,如果用户点击了checkbox那么就会保存7天
class loginHandler(tornado.web.RequestHandler):
def get(self):
self.render('login.html',status_text="") def post(self):
username=self.get_argument("username",None)
pwd=self.get_argument("password",None) check=self.get_argument("auto",None)
if username=="aa"and pwd=="bb":
if check:
# self.get_secure_cookie()
self.set_cookie("username",username,expires_days=)
self.set_cookie("auth","",expires_days=)
else:
r=time.time()+
self.set_cookie("auth","",expires=r)
self.redirect("/manager")
else:
self.render("login.html",status_text="登录失败")
2、设置cookie参数
set_cookie 中的参数如下:
domin:域名 用于区分域名
expires:超出时间 单位秒
path=”” 设置权限,有些cookie只能在某些url下生效 如果等于 \,那么默认在全局中生效
expires_day:设置超出时间 ,单位天 如果要设置立即过期:expires=time.time(),即时间设置成当天时间,就是立即过期
下面就是进入到隐私页面之后,cookie直接立即过期
class LogoutHandler(tornado.web.RequestHandler):
def get(self):
self.set_cookie("auth","",expires=time.time())
self.redirect("/login")
3、 tornado自带的设置cookie的方法
用下面的方法
self.get_secure_cookie()
但是必须在配置中加入
settings = {
'template_path': 'views',
"cookie_secret":"sdwdzxc", 这个配置中必须加入,value的值随意设置
}
4、利用ajax
初始原生ajax
Ajax依赖于浏览器,在主流浏览器中都有XMLHttpRequest这个模块,并且通过这个模块就可以和后台发送消息了
XMLHttpRequest实现Ajax上 XMLHttpRequest对象方法和属性的讲解
request是客户端发向服务器端的请求,response是服务器端对客户端的响应,两者发出对象与接收对象不同
在XMLHttpRequest对象的主要方法
、 void open(String method,String url,Boolen async)
用于创建请求
参数:
method: 请求方式(字符串类型),如POST GET DELETE...
url: 要请求的地址(字符串类型)
async: 是否异步(布尔类型) 如果为false那么就会夯住,所以一般设置为true 、 void send(String body)
用于发送请求 发送数据到后台
参数:
body: 要发送的数据(字符串类型) 、void setRequestHeader(String header,String value)
用于设置请求头
参数:
header: 请求头的key(字符串类型)
value: 请求头的value(字符串类型)
User-Agent 根据用户发送的请求头的不同,来显示不同的设备 、 String getAllResponseHeaders()
获取所有的响应头
返回值:
相应头数据(字符串类型) 、 String getResponseHeader(String header)
获取响应头中指定的header的值
参数:
header:响应头key(字符串类型)
返回值:
响应头中指定的header对应的值 、 void abort()
终止请求
XMLHttpRequest对象的主要属性
、 Number readystate
状态值(整数) 详细:
- 未初始化,尚未调用open()方法
- 启动,调用了open()方法,没有调用send()方法
- 发送,已经调用了send()方法,未接到响应
- 接收,已经接受到部分响应数据
- 完成,已经接受到所有相应数据 、 Function onreadystatechange
当readystate的值改变时自动触发执行其对应的函数(回调函数) 、 String responseText
服务器返回的数据(字符串类型)
、XmlDocument responseXML
服务器返回的数据(xml对象)
、 Number states
状态码(整数),如200、、、 、 String statesText
状态文本(字符串),如ok 、NotFound
如果要用post方式来发送的时候,必须要设置请求头,get方式的时候不需要设置
下面例子就是用ajax后台登陆
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <input id="user" type="text" name="username"/>
<input id="pwd" type="password" name="password"/> <input id="check" type="checkbox" name="auto" value=""/>7天免密码
<input type="button" value="登录" onclick="SubmitForm()"/> <script>
// 下面只要状态变更,就会调用回调函数func
xhr=null;
function SubmitForm(){
xhr=new XMLHttpRequest();
xhr.open("POST","/login",true);
xhr.onreadystatechange=func; 上面是post方法,所以下面必须设置请求头,get方法不用设置
xhr.setRequestHeader("content-Type","application/x-www-form-urlencoded;charset=UTF-8")
xhr.send("username="+document.getElementById('user').value+";password="+document.getElementById('pwd').value);
}
function func(args){
if(xhr.readyState==){
console.log();
// 服务器发送什么,就返回什么
console.log(xhr.responseText);
var data=xhr.responseText;
//把字符串解析成一个对象
var ret_dict=JSON.parse(data);
// 这里表示ajax状态成功,状态为4的时候得到这个对象,有这个对象那么就是成功登录
if(ret_dict.statu){ }else{
alert("账号密码错误")
}
}
}
</script> </body>
</html>
HTML代码
#!/usr/bin/env python
# -*- coding:utf- -*- import tornado.ioloop
import tornado.web
import time class loginHandler(tornado.web.RequestHandler):
def get(self):
self.render("login.html")
def post(self,*args,**kwargs):
dic={"statu":True,"message":""}
user=self.get_argument("username")
pwd=self.get_argument("password")
if user=="aa"and pwd=="":
pass
else:
dic["statu"]=False
dic["message"]="用户名或者密码错误"
import json
self.write(json.dumps(dic)) # 注意这里只能接收字符串
# self.write("ok")
settings = {
'template_path': 'views',
} # 下面第一个参数是HTML中的参数映射
application = tornado.web.Application([
(r"/login", loginHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
python代码
首先要明白response是服务器向客户端发送信息
request是客户端向服务端发送信息
首先在html代码中,接收客户端向服务端发送请求,到后台post方法中,在post方法中判断,并且给客户端返回信息,这个时候状态发生改变,所以执行func方法,并且获取到服务器向客户端发送的数据 ,把发送的字符串转化成对象,判断这个对象中的statu的值(,由于在post方法中如果用户帐号密码正确那么statu对应的值是true,错误对应的值为false,)如果为true,那么就什么也不输出,否则就输出alert
流程
初始jqueryAjax
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <input id="user" type="text" name="username"/>
<input id="pwd" type="password" name="password"/> <input id="check" type="checkbox" name="auto" value=""/>7天免密码
<input type="button" value="登录" onclick="SubmitForm()"/>
<script src="{{static_url('jquery.js')}}}"></script>
<script>
function SubmitForm(){
$.post("/login",{"username":$("#user").val(),"password":$("#pwd").val()},function(callback){
console.log(callback)
})
}
html代码
#!/usr/bin/env python
# -*- coding:utf- -*- import tornado.ioloop
import tornado.web
import time class loginHandler(tornado.web.RequestHandler):
def get(self):
self.render("login.html")
def post(self,*args,**kwargs):
dic={"statu":True,"message":""}
user=self.get_argument("username")
pwd=self.get_argument("password")
if user=="aa"and pwd=="":
pass
else:
dic["statu"]=False
dic["message"]="用户名或者密码错误"
import json
self.write(json.dumps(dic)) # 注意这里只能接收字符串
# self.write("ok")
settings = {
'template_path': 'views',
'static_path':'static',
} # 下面第一个参数是HTML中的参数映射
application = tornado.web.Application([
(r"/login", loginHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
python代码
用户点击登录的时候,这个页面会偷偷的执行post方法,首先发送url,之后发送输入的值,发送成功之后执行回调函数
web框架详解之tornado 二 cookie的更多相关文章
- web框架详解之tornado 一 模板语言以及框架本质
一.概要 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...
- web框架详解之 tornado 四 模板引擎、session、验证码、xss
一.模板引擎 基本使用 继承,extends 页面整体布局用继承 导入,include 如果是小组件等重复的那么就用导入 下面是目录 首先在controllers里面创建一个文件,文件里面是页面类 # ...
- web框架详解之tornado 三 url和分页
一.代码目录构建 controllers :处理业务逻辑的 account:处理账户相关的 上面目录作用和内容 controllers 包 :处理业务逻辑的 account:处理账户相关的 home ...
- Spark2.1.0——内置Web框架详解
Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...
- web框架详解之三Modal
一.Modal操作之创建表,添加数据 1. 配置Django中settings的设置连接mysql数据库,然后在mysql数据库中创建库 2. 在models中创建表.继承Model 3. 在sett ...
- Shiro 安全框架详解二(概念+权限案例实现)
Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...
- (转) shiro权限框架详解06-shiro与web项目整合(上)
http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...
随机推荐
- swift 中的问号跟感叹号
?: 变量在使用过程中可能存在空值,则需要用?标记,否则赋空值会报错 ? 1 2 var mustNoNilValue: String = "Swift" var canNilVa ...
- Cookie-Parser是怎样解析签名后的cookie的(同一时候对cookie和cookie-signature进行说明)
第一步:我们来学习一下cookie-signature: var cookie=require('./index'); var val = cookie.sign('hello', 'tobiisco ...
- Qemu线程池介绍
有时我们希望把一部分工作通过创建线程的方式异步执行,这样我们可以在执行任务的同时,继续执行其他任务.但是如果这种需求比较多的话,频繁的创建和销毁线程带来很大的性能损耗.如果我们能创建一个或一些线程,然 ...
- python 中的"switch"用法
转载:http://python.jobbole.com/82008/ 为什么Python中没有Switch/Case语句? 不同于我用过的其它编程语言,Python 没有 switch / case ...
- Git--Bug解决篇
Git--公司bug解决篇 作为程序员,我们时常遇到这样的场景,公司的产品上线了,程序员们美滋滋的开始开发新功能希望得到更多的流量.这时候,公司上线的产品发生了很严重的bug,可是我们已经在这个bug ...
- hihoCoder #1312 : 搜索三·启发式搜索(A*, 康托展开)
原题网址:http://hihocoder.com/problemset/problem/1312 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在小Ho的手机上有 ...
- 2016 acm香港网络赛 C题. Classrooms(贪心)
原题网址:https://open.kattis.com/problems/classrooms Classrooms The new semester is about to begin, and ...
- STM32F103RCT6移植到STM32F103C8T6注意事项
1,修改IC为STC32F103C8 2,修改晶振为8.0M 3,修改C/C++宏定义,由STM32F10X_HD,USE_STDPERIPH_DRIVER 改为 STM32F10X_MD,USE_S ...
- visual studio code (vscode)像 sublime text 的 ctrl+d 一样多光标选中
快捷键是 ctrl+m ,返回上一个选中时ctrl+u. 文件 ==>首选项 ==>键盘快捷键() 里面可以查到,下一个是“将选择添加到下一个查找匹配项”,返回上一个是“cursorund ...
- EasyPlayer RTSP播放器运行出现: Unable to load DLL 找不到指定的模块。exception from HRESULT 0x8007007E 解决方案
最近有EasyPlayer RTSP播放器的开发者反馈,在一台新装的Windows Server 2008的操作系统上运行EasyPlayer RTSP播放器出现"Unable to loa ...