Flask 请求响应 session

请求响应

flask的请求信息都在request里

flask的响应方式有四剑客,也可以自定义响应

请求相关信息

from flask import Flask, request

request.method  提交的方法
request.args  get请求提及的数据  类似字典类型
request.form   post请求提交的数据  类似字典类型
request.values  post和get提交的数据总和  类似字段类型
request.cookies  客户端所带的cookie
request.headers  请求头
request.path     不带域名,请求路径
request.full_path  不带域名,带参数的请求路径
request.script_root  
request.url           带域名带参数的请求路径
request.base_url      带域名请求路径
request.url_root      域名
request.host_url      域名
request.host          127.0.0.1:500
request.files
obj = request.files['the_file_name']  # 根据文件名实例化文件对象
obj.save('/var/www/uploads/' + secure_filename(obj.filename))  # 保存文件

响应相关信息

from flask import Flask, request, render_template, redirect, jsonify

return "字符串"
return render_template('html模板路径',**{})
return redirect('/index.html')
return jsonify({'k1':'v1'})

自定义响应

1 导入make_response
2 response=make_response(4剑客)
3 操作response
4 return response

from flask import Flask
from flask import render_template
from flask import make_response

@app.route('/login.html', methods=['GET', "POST"])
def login():
    # 实例化响应对象,可以将四剑客传入,
    response = make_response(render_template('login.html'))
    # response是flask.wrappers.Response类型
    response.delete_cookie('key')  # 删除客户端的cookie
    response.set_cookie('key', 'value')  # 在响应对象中添加cookie
    response.headers['X-Something'] = 'A value'  # 在响应对象中设置响应头
    return response

cookie与session

在使用session之前必须现在设置一下密钥

app.secret_key="asdas" #值随便

在使用session之前必须现在设置一下cookies的键

app.config['SESSION_COOKIE_NAME']="keys" 

除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。 (app.session_interface对象)

设置:session['username'] = 'xxx'
在django中发什么三件事: 1,生成一个随机的字符串 2 往数据库存 3 写入cookie返回浏览器
在flask中他没有数据库,但session是怎样实现的?
    1.生成一个密钥写入这个cookie,然后下次请求的时候,通过这个cookie解密,然后赋值给session
    2.我们通过app.session_interface来查看 

删除:session.pop('username', None)

session源码

  • app.session_interface中save_session的参数(设置cookie的参数)

key, 键
value='', 值
max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=".example.com"所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取
secure=False, 浏览器将通过HTTPS来回传cookie
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

  • 源码的执行流程

-save_seesion
    -响应的时候,把session中的值加密序列化放大到了cookie中,返回到浏览器中
-open_session
    -请求来了,从cookie中取出值,反解,生成session对象,以后再视图函数中直接用sessoin就可以了。

app.session_interface这里面看
存session,
1 调用save_session,将我们的session加密的val,读取配置文件['SESSION_COOKIE_NAME']得到key
2 将1种的key,val存储到cookies

取session
1 获取request里面的cookies,获取里面key,这个key就是['SESSION_COOKIE_NAME'],值就是加密的值
2 对该值进行解密

案例

from flask import Flask,session

app = Flask(__name__)
# 设置session秘钥
app.secret_key="askjdaksd"
# 用于返回到前端作为cookies的键
app.config['SESSION_COOKIE_NAME']="cookie_keys"

# app.session_interface

@app.route("/")
def index():
    session['key']="value"
    return "ok"

@app.route("/index1")
def index1():
    # 获取session
    session.pop('key')
    print(session['key'])  # value
    return "ok"

# 前端cookies中: name是cookie_keys , value是session的key与value加密的字符串
# session就是一个字典

第三方session

pip3 install redis
pip3 install flask-session
from flask import Flask, session, redirect
from flask.ext.session import Session


app = Flask(__name__)
app.debug = True
app.secret_key = 'asdfasdfasd'


app.config['SESSION_TYPE'] = 'redis'
from redis import Redis
app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port='6379')
Session(app)


@app.route('/login')
def login():
    session['username'] = 'alex'
    return redirect('/index')


@app.route('/index')
def index():
    name = session['username']
    return name


if __name__ == '__main__':
    app.run()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值