flask中的session cookie 测试 和 项目中的用户状态保持
# -*- coding:utf-8 -*-
# Author: json_steve from flask import Flask, current_app, make_response, request, session app = Flask(__name__)
app.secret_key = '123' @app.route('/')
def index():
response = make_response('jsonsteve')
# response.headers['Set-Cookie'] = 'heads'
response.set_cookie('a','1',max_age=3600)
return response @app.route('/get_cookie')
def get_cookie():
print request.cookies # {'heads; a': u'1'}
# k = request.cookies['heads; a'] # cookie的获取
k = request.cookies['a'] # 获取不到 报错
print k
return 'get_cookie %s' % k @app.route('/delete_cookie')
def delete_cookie():
response = make_response('delete_success')
response.delete_cookie('a')
return response @app.route('/set_session')
def set_session():
session['name'] = 'jsonsteve' # 设置sesssion
return 'set_success' @app.route('/get_session')
def get_session():
name = session.get('name') # 获取session 存哪里去了
return name if __name__ == '__main__':
app.run(debug=True) cookie测试 当访问http://127.0.0.1:5000/ 时,服务器回给浏览器的 Response Headers:
Content-Length:9
Content-Type:text/html; charset=utf-8
Date:Sat, 23 Dec 2017 10:12:53 GMT
Server:Werkzeug/0.12.2 Python/2.7.11+
Set-Cookie:heads
Set-Cookie:a=1; Expires=Sat, 23-Dec-2017 11:12:53 GMT; Max-Age=3600; Path=/ 1,Content-length:9 是因为返回的消息实体是9个字节,因为make_response('jsonsteve')。
2,response.headers['Set-Cookie'] = 'headers' 实际就是直接设置响应头,此设置的cookie过期时间是浏览器会话结束时。
3,response.set_cookie('a','1',max_age=3600) 这种设置cookie的方式过期时间是3600s。
4,如果response.headers['Set-Cookie'] = 'headers'写到response.set_cookie('a','1',max_age = 3600)的后面,则只产生一个cookie就是headers
5,headers是cookie的内容,名字是空。 当访问http://127.0.0.1:5000/get_cookie,获取cookie的时候,浏览器会向服务器发送的请求头: RequestHeaders:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:heads; a=1
Host:127.0.0.1:5000
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36 请求头的cookie实际是有两个,由于flask将cookie封装成字典在request.cookies里,但是有一个cookie没有名字,只有值headers,所以封装成了这样{'heads; a': u'1'},注意键是‘heads; a’。
其次不同的浏览器,或者再此基础上你又设置了一个response.set_cookie('b','2',max_age=3600),这时浏览器再次访问服务器,发送的cookie就可能是Cookie:a=1;b=2;headers,但是这种情况向flask的request.cookies就变成{'a': u'1', 'b': u'2'},headers没了,太乱了,就别用response.headers['Set-Cookie']设置啦。 注意:response.delete_cookie('a') 虽然是delete但是不是删除名字是a的cookie,而是设置a的值是空,过期时间是0
回复的http头是: Set-Cookie:a=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/ session测试 当浏览器访问 http://127.0.0.1:5000/set_session时,服务器回给浏览器 ResponseHeaders:
Content-Length:11
Content-Type:text/html; charset=utf-8
Date:Sat, 23 Dec 2017 11:34:27 GMT
Server:Werkzeug/0.12.2 Python/2.7.11+
Set-Cookie:session=eyJuYW1lIjp7IiBiIjoiYW5OdmJuTjBaWFpsIn19.DR_Qww.V_Xekew9d9O_PeH2y8ujB9RCYMw; HttpOnly; Path=/ 也就是说,flask的session默认是放到cookie里,名字是session,最后存储在浏览器的,对存储的session的键值是加密的,这是使用session必须设置app.secret_key = '123'密钥的原因。密钥的生成方法一般是在终端生成随机数
1
>>> import os,base64
>>> base64.b64encode(os.urandom(48))
'/V9pfTLaYKnyGYhnzGqYlnYDEee2UksbMkFmSXG4ZtCNfhVCHs4BnOclPtg2RHbf' 注:在每次访问http://127.0.0.1:5000/get_session,访问session时,flask又会重新对session加密,所以cookie中的session名字所对应的内容会变化。 项目中的用户状态保持 一般项目会把session保存到服务器(redis),所以在设置config是可以这样设置 # redis链接配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
SESSION_TYPE = "redis"
# 设置保存到的redis,默认如果没设置话,Flask-Session会帮我们创建一个redis
SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
# 签名
SESSION_USE_SIGNER = True
# 设置过期时间
PERMANENT_SESSION_LIFETIME = 86400 不要忘记Session初始化 from flask_session import Session
Session(app) 在登陆时将登陆信息发送给后台服务器: var params = {
"mobile": mobile,
"password": password,
}; $.ajax({
url:"/api/v1.0/session",
method: "post",
headers: {
"X-CSRFToken": getCookie("csrf_token")
},
data: JSON.stringify(params),
contentType: "application/json",
success: function (resp) {
if (resp.errno == "0") {
location.href = "/index.html"
}else {
$("#password-err span").html(resp.errmsg);
$("#password-err").show()
}
}
}) 后台服务器接收到用户信息后将信息存储到session中,而session存到了redis里。 保存用户登录状态
session["user_id"] = user.id
session["mobile"] = user.mobile
session["name"] = user.name 如果访问需要登陆的网页,如何确定用户登陆了呢,可以写一个装饰器:
def login_required(f):
@functools.wraps(f) # __name__还是原来的
def warrper(*args, **kwargs):
user_id = session.get('user_id')
if not user_id:
return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')
else:
g.user_id = user_id
return f(*args, **kwargs)
return warrper 就是去session里看一下又没user_id,因为session是请求上下文,所以不同的请求session也是不同的所以不用担心session会不会混乱。
flask中的session cookie 测试 和 项目中的用户状态保持的更多相关文章
- 将 flask 中的 session 存储到 SQLite 数据库中
将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...
- itest 开源测试管理项目中封装的下拉列表小组件:实现下拉列表使用者前后端0行代码
导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景 像easy ui 之类的纯前端组件,也有下拉列表组件,但是使用的时候,每个下拉列表,要配一个URL ...
- MVC3中在同一解决方案的不同项目中实现Area功能
1.背景 微软在MVC中引入了Area概念,用于复杂项目的分工开发.如一个MVC项目中Controller过多时,就会导致项目中包含大量的Controller+View+Model,无论是查 ...
- 在Swift项目中使用OC,在OC项目中使用Swift
几天前,我开始新的App的开发了.终于有机会把swift用在实战中了,也学到了之前纯学语法时没有机会获得的知识. 这篇博文中,我就如何使用swift.OC混编做一个介绍. OC中使用Swift 首先, ...
- centos nginx 中安装ssl证书 以及在项目中的使用
今天阿里云的证书到期了,重新申请了一个,下面是从申请到安装以及结合项目使用的过程: 1.登录阿里云 2.在左侧找到SSL证书 3.申请免费的证书 4.下载证书 5.根据说明配置nginx 6.在项 ...
- Flask入门request session cookie(二)
1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...
- spring JdbcTemplate 在itest 开源测试管理项目中的浅层(5个使用场景)封装
导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景, 在做项目的时候,用的JPA ,有些复杂查询,比如报表用原生的JdbcTemplate ,很不方便;传参也不方便 ...
- django中的session,cookie
https://blog.csdn.net/chen1042246612/article/details/84327046 https://www.imooc.com/wenda/detail/396 ...
- springBoot框架在idea中创建流程 同时存在一个项目中
1.新建普通maven工程 2.在父级pom中按需修改 3.删除父级src目录 4.创建公共模块common,里面只有service接口和实体类 5.构建微服务模块,provider 6.引用Zook ...
随机推荐
- 【转】Android 关闭多个视图Intent.FLAG_ACTIVITY_CLEAR_TOP用法
如果已经启动了四个Activity:A,B,C和D.在D Activity里,我们要跳到B Activity,同时希望C finish掉, 可以在startActivity(intent)里的inte ...
- 关于OpenFileDialog的使用(转)
OpenFileDialog控件有以下基本属性 InitialDirectory 对话框的初始目录 Filter 要在对话框中显示的文件筛选器,例如,"文本文件(*.txt)|*.txt|所 ...
- createrepo -g /enp/comps.xml .
cd /enp; createrepo -g /enp/comps.xml .
- iOS通讯录(纯纯的干货)
一.iOS8.0 1.访问用户通讯录的两个框架 (1)AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人 (2)AddressB ...
- Gym - 101208C 2013 ACM-ICPC World Finals C.Surely You Congest 最大流+最短路
题面 题意:给你n(2w5)个点,m条边(7w5)有k(1e3)辆车停在某些点上的,然后他们都想尽快去1号点,同时出发,同一个点不允许同时经过, 如果多辆车同时到达一个点,他们就会堵塞,这时候只能选择 ...
- selenium3 + python - autoit上传文件
一.环境准备: 1.可以autoit官网上下载,安装 http://www.autoitscript.com/site/ 2.AutoIt里面几个菜单功能介绍: SciTE Script Editor ...
- java.net.URISyntaxException: Illegal character in query
java使用httpclient爬取一个网站的时候,请求:String url3="http://sh.58.com/ershoufang/33562546149042x.shtml?amp ...
- C#图片辅助类,形成缩略图
完善一下别人的方法,成自己好用的工具 using System.Drawing; using System.Drawing.Imaging; namespace GXNUQzzx.Tools.Util ...
- [ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...
- [ NOIP 1998 ] TG
\(\\\) \(\#A\) 车站 火车从第\(1\)站开出,上车的人数为\(a\),然后到达第\(2\)站,在第\(2\)站有人上.下车,但上.下车的人数相同,因此在第\(2\)站开出时(即在到达第 ...