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 ...
随机推荐
- Effective JavaScript Item 10 避免使用with
本系列作为Effective JavaScript的读书笔记. Item 9:避免使用withkeyword 重点: 设计withkeyword本来是为了让代码变简洁,可是却起到了相反的效果.比方: ...
- 本地文件上传到linux
首先下载插件,输入下面命令: yum -y install lrzsz 然后输入rz选择上传文件: rz 如果rz命令不好使的话,就输入: rz -be
- SVN 钩子操作-同步更新web目录
一个简单的钩子演示:也可以网上搜索其他高级的 本次想要达到的功能是:每次用户commit 到仓库后,仓库的钩子会自动把程序又更新的www/的web发布目录 1.现在web目录下创建一个test.com ...
- source sh运行脚本的差别
主要有两种方式运行shell脚本 1)source test.bsh 2)sh test.bsh 1)souce运行脚本文件会在父程序中运行.各项动作都会在原本的bash内生效.运行过程不另开进程.脚 ...
- 怎样新建Quartusproject—FPGA新手教程
这一章我们来实现第一个FPGAproject-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建project,代码设计,综合实现.管脚约束,下载FPGA程序. 掌握本章内 ...
- web.xml中url-pattern匹配规则
小知识 一般的URL组成 URL = 服务器地址 + RequestURI 例如URI:http://localhost:8080/practice/main [http://localhost:80 ...
- MapReduce源码分析之新API作业提交(二):连接集群
MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster,代码如下: private synchronized void co ...
- Java Web开发笔记
问题: 读取资源文件问题 servletContext.getRealPath() servletContext.getResouce().getPath() setvletContext.getRe ...
- div+css 画三角形
<style type="text/css"> .rightdirection { width:0;height:0; line-height:0; b ...
- hihoCoder #1388 : Periodic Signal
NTT (long long 版) #include <algorithm> #include <cstring> #include <string.h> #inc ...