flask学习文档04-request获取请求参数,状态保持cookie和session

版权声明:内容版权为CSDN用户:kayseen 所有,若您需要引用、转载,需要注明来源及原文链接 https://blog.csdn.net/m0_43394876/article/details/88540164

1.request获取请求参数

request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)

常用的属性如下:

属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

1.简单示例

  • 获取上传的图片并保存到本地
@app.route('/', methods=['POST'])
def index():
    pic = request.files.get('pic')
    pic.save('./static/aaa.png')
    return 'index'
  • 获取request.data数据
@app.route('/data', methods=['POST'])
def data():
    data = request.data
    print(data)
    return data

2.代码示例

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

# Address already in use
# ubuntu: netstat -apn | grep 5000 找到5000端口所对应的pid
# kill -9 pid
# mac lsof -i:5000


@app.route('/upload', methods=['POST'])
def upload():
	#request.files是来获得上传的文件
    file = request.files.get('pic')#pic是postman里面的key
    #调用file的save方法来保存文件
    file.save('aaaa.png')
    return 'success'


@app.route('/data', methods=['POST'])
def data():
	#data是从postman的raw里面上传的数据
    data = request.data
    print(data)
    return 'ok'


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

2.状态保持

  • 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
  • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
  • 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  • 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 实现状态保持主要有两种方式:
    • 在客户端存储信息使用Cookie
    • 在服务器端存储信息使用Session

无状态协议:

  1. 协议对于事务处理没有记忆能力
  2. 对同一个 url 请求没有上下文关系
  3. 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
  4. 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
  5. 人生若只如初见

1.状态举例:

  • 有状态:
    • A:你今天中午吃的啥?
    • B:吃的大盘鸡。
    • A:味道怎么样呀?
    • B:还不错,挺好吃的。
  • 无状态:
    • A:你今天中午吃的啥?
    • B:吃的大盘鸡。
    • A:味道怎么样呀?
    • B:???啊?啥?啥味道怎么样?
  • 所以需要cookie这种东西:
    • A:你今天中午吃的啥?
    • B:吃的大盘鸡。
    • A:你今天中午吃的大盘鸡味道怎么样呀?
    • B:还不错,挺好吃的。

2.cookie

  • Cookie

    :指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。

    • 复数形式Cookies。
    • Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
    • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
    • Cookie的key/value可以由服务器端自己定义。
  • 应用

    • 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
    • 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
    • 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
  • 提示

    • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

    • Cookie基于域名安全,不同域名的Cookie是不能互相访问的

      • 如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息
      • 浏览器的同源策略
    • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

      img

1. 设置cookie

from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'itcast')
    return resp
  • 设置过期时间
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response

2. 获取cookie

from flask import Flask,request
#获取cookie
@app.route('/request')
def index():
    resp = request.cookies.get('username')
    return resp

3. 删除cookie

from flask import Flask,request
@app.route('/delete')
def delete_cookie():
    response = make_response('success')
    response.delete_cookie('username')
    return response

4.cookie代码

maxfrom flask import Flask
from flask import make_response
from flask import request

app = Flask(__name__)

@app.route('/')
def index():
    user_id = request.cookies.get('user_id')        #request来提取
    user_name = request.cookies.get('user_name')
    return '%s --- %s' % (user_id, user_name)


@app.route('/login')
def login():
    # 默认判断账号与密码是正确的/创建响应
    response = make_response('success')
    # 设置cookie
    response.set_cookie('user_id', '1', max_age=3600)
    response.set_cookie('user_name', 'laowang', max_age=3600)
    return response


@app.route('/logout')
def logout():
    response = make_response('success')
    response.delete_cookie('user_id')
    response.delete_cookie('user_name')
    return response


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

3.session

  • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session
  • Session依赖于Cookie

1.session数据的获取

session:请求上下文对象,用于处理http请求中的一些数据内容

@app.route('/index1')
def index1():
    session['username'] = 'itcast'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')
# 删除session
@app.route('/delete')
def delete_session():
    # 注意:pop后如果不指定默认值,那么再次访问/delete后,由于没有username这个键,代码会报错,如果设置默认值为None,则返回None
    session.pop('username', None)
    return 'success'

记得设置secret_key: app.secret_key = ‘xxx’ secret_key的作用:

https://segmentfault.com/q/1010000007295395

2.session代码练习

from flask import Flask,current_app
from flask import session

app = Flask(__name__)
# 使用 session 的话,需要配置 secret_key来加密
app.config['SECRET_KEY'] = 'fjkasdjfklasjdfl'

@app.route('/')
def index():
	# user_id = session['user_id']			#取不到会报错
    user_id = session.get('user_id', '')	#如果没取到犯会空,不会报错
    user_name = session.get('user_name', '')
    return '%s %s' % (user_id, user_name)

@app.route('/login')
def login():
#     # 假装校验成功
    session['user_id'] = "1"
    session['user_name'] = "laowang"
    return 'success'


@app.route('/logout')
def logout():
	# session.pop('user_id')		#多次退出会报错
    session.pop('user_id', None)       #pop的作用是删除
    session.pop('user_name', None)
    return 'success'


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

猜你喜欢

转载自blog.csdn.net/m0_43394876/article/details/88540164