# -*- 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 测试 和 项目中的用户状态保持的更多相关文章

  1. 将 flask 中的 session 存储到 SQLite 数据库中

    将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...

  2. itest 开源测试管理项目中封装的下拉列表小组件:实现下拉列表使用者前后端0行代码

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景       像easy ui 之类的纯前端组件,也有下拉列表组件,但是使用的时候,每个下拉列表,要配一个URL ...

  3. MVC3中在同一解决方案的不同项目中实现Area功能

    1.背景      微软在MVC中引入了Area概念,用于复杂项目的分工开发.如一个MVC项目中Controller过多时,就会导致项目中包含大量的Controller+View+Model,无论是查 ...

  4. 在Swift项目中使用OC,在OC项目中使用Swift

    几天前,我开始新的App的开发了.终于有机会把swift用在实战中了,也学到了之前纯学语法时没有机会获得的知识. 这篇博文中,我就如何使用swift.OC混编做一个介绍. OC中使用Swift 首先, ...

  5. centos nginx 中安装ssl证书 以及在项目中的使用

    今天阿里云的证书到期了,重新申请了一个,下面是从申请到安装以及结合项目使用的过程: 1.登录阿里云   2.在左侧找到SSL证书 3.申请免费的证书 4.下载证书 5.根据说明配置nginx 6.在项 ...

  6. Flask入门request session cookie(二)

    1 HTTP方法分类 1 GET 浏览器告知服务器:只获取页面上的信息并发给我.这是最常用的方法. 2 HEAD 浏览器告诉服务器:欲获取信息,但是只关心消息头 .应用应像处理 GET 请求一样来处理 ...

  7. spring JdbcTemplate 在itest 开源测试管理项目中的浅层(5个使用场景)封装

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景, 在做项目的时候,用的JPA ,有些复杂查询,比如报表用原生的JdbcTemplate ,很不方便;传参也不方便 ...

  8. django中的session,cookie

    https://blog.csdn.net/chen1042246612/article/details/84327046 https://www.imooc.com/wenda/detail/396 ...

  9. springBoot框架在idea中创建流程 同时存在一个项目中

    1.新建普通maven工程 2.在父级pom中按需修改 3.删除父级src目录 4.创建公共模块common,里面只有service接口和实体类 5.构建微服务模块,provider 6.引用Zook ...

随机推荐

  1. ios7--UIImageView

    // // ViewController.m // 03-UIImageView的使用 // #import "ViewController.h" @interface ViewC ...

  2. 【转】android-修改TextView中部分文字的颜色

    textView = (TextView) findViewById(R.id.textview); SpannableStringBuilder builder = new SpannableStr ...

  3. POJ 1663:Number Steps

    Number Steps Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13758   Accepted: 7430 Des ...

  4. javaBean注意事项

    1.重写tostring方法 2.属性第一位小写

  5. json-server的关系图谱详解(Relationships)

    json-server的关系图谱 json-server是非常好用的一款模拟REST API的工具,文档也很详细和全面.详情:json-server而其中的关系图谱是它非常强大的一个功能,可以非常方便 ...

  6. HTML Email 编写指南

    今天,我想写一个"低技术"问题. 话说我订阅了不少了新闻邮件(Newsletter),比如JavaScript Weekly.每周收到一封邮件,了解本周的大事. 有一天,我就在想, ...

  7. [Swift通天遁地]二、表格表单-(3)在表格中嵌套另一个表格并使Cell的高度自适应

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. 绝对牛x的代码注释

    备注:文中字符均可以直接复制直接用! 再补上一个好玩的网站 Ascii World:(链接:http://www.asciiworld.com/). 网站上的图形很多,感兴趣的可以复制链接到浏览器上打 ...

  9. 观察者模式-C#实现

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 观察者模式有四个角色:抽象主题.具体主题.抽象观察者.具体观察者. 抽象主题:把所有观察者对象 ...

  10. 【洛谷1117_BZOJ4650】[NOI2016] 优秀的拆分(哈希_后缀数组_RMQ)

    题目: 洛谷1117 分析: 定义把我校某兔姓神犇Tzz和他的妹子拆分,为"优秀的拆分" 随便写个哈希就能有\(95\)分的好成绩-- 我的\(95\)分做法比fei较chang奇 ...