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 ...
随机推荐
- C#的内存管理知识 .
本章介绍内存管理和内存访问的各个方面.尽管运行库负责为程序员处理大部分内存管理工作,但程序员仍必须理解内存管理的工作原理,了解如何处理未托管的资源. 如果很好地理解了内存管理和C#提供的指针功能,也就 ...
- return在Java中的两个作用
Java中return的两个作用: (1)返回方法指定类型的值(这个值总是确定的),也可以是对象 (2)方法的结束
- ArgumentError: You need to supply at least one validatio
创建: 2017/10/02 意思: validate没有内容 例: validates :title
- eclipse的快捷键---调试
1:查看类或接口的方法 Ctrl+T 2:debug调试查看信息 Ctrl+Shift+i 3:debug调试快捷键 (1):F11好像是重新运行debug. (2):F8直接输出结果.(3):F5单 ...
- Jquery 表单基础元素操作总结
最近做前端比较多总结一些常用功能: radio 单选选中并且出发change事件: $(selector).find('input:radio[name=valuationMode]').filter ...
- 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]
[题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...
- $P3931 SAC E一道难题 Tree$
problem #include <bits/stdc++.h> #define rep(i,j,n) for(register int i=j;i<=n;i++) #define ...
- ACM_Mystery
Mystery Time Limit: 2000/1000ms (Java/Others) Problem Description: No Description Input: The first l ...
- Coursera公开课-Machine_learing:编程作业3
第四周 编程作业: Multi-class Classification and Neural Networks 这周作业与上一周有许多相同的部分,比如longistic regression中的lr ...
- Elasticsearch之CURL命令的GET
这是个查询命令. 前期博客 Elasticsearch之CURL命令的PUT和POST对比 1. 以上是根据员工id查询. 即在任意的查询字符串中添加pretty参数,es可以得到易于我们识别的jso ...