一、状态保持Session和Cookie
- 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
- 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
- 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
- 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
- 实现状态保持主要有两种方式:
- 在客户端存储信息使用
Cookie
- 在服务器端存储信息使用
Session
- 在客户端存储信息使用
from flask import Flask,make_response,request,session
app = Flask(__name__)
# 设置密钥
# app.config['SECRET_KEY'] = '6BYWniv8tKE+3jEF+mlJl6YqjNVPpuvSQnO/ey/W6Y89OmpreKWibQ=='
app.config['SECRET_KEY'] = '123'
# 状态保持:cookie和session,服务器会记住客户端信息。
# cookie:基于键值对的字符串,服务器生成cookie信息,key/value都存储在浏览器中。
# session:基于键值对的字符串,基于cookie实现,服务器生成session信息,key存储在浏览器中,value存储在服务器中。
# 设置cookie
@app.route('/')
def index():
response = make_response('set cookie success')
# 设置cookie,并且设置有效期,单位是秒
response.set_cookie('itcast','python18',max_age=3600)
# 返回响应
return response
# 获取cookie
@app.route('/get')
def get_cookie():
itcast = request.cookies.get('itcast')
return itcast
# session设置,一般会存储在数据库中,等到学习redis数据库后,再次设置session。
@app.route('/set_session')
def set_session():
# 使用flask内置的session对象
session['itcast'] = 'python18'
return 'set session success'
if __name__ == '__main__':
app.run(debug=True)
二、上下文对象
上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。
Flask中有两种上下文,请求上下文和应用上下文
上下文的应用为了python的多线程之间互不影响
请求上下文(request context)
- request
- 封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。
- session
- 用来记录请求会话中的信息,针对的是用户信息。举例:session[‘name’] = user.id,可以记录用户信息。还可以通过session.get(‘name’)获取用户信息。
应用上下文(application context)
- current_app
应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:
1.应用的启动脚本是哪个文件,启动时指定了哪些参数
2.加载了哪些配置文件,导入了哪些配置
3.连了哪个数据库
4.有哪些public的工具类、常量
5.应用跑再哪个机器上,IP多少,内存多大
current_app.name
current_app.test_value='value'
- g变量
g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
g.name='abc'
注意:不同的请求,会有不同的全局变量
from flask import Flask,request,current_app,session,g
app = Flask(__name__)
"""
请求上下文对象:request和session
request是Flask框架内置的请求上下文对象;
request常用的属性:args/form/method/url/headers/cookies/files等
args:查询字符串,url地址栏中,?号后面,以=号传值,以&号分隔的数据。
http://www.baidu.com/?wd=北京天气
"""
# request的基本用法:args
@app.route('/')
def index():
# 获取get请求的查询字符串参数
# 前端浏览器请求的url地址:http://127.0.0.1:5000/?itcast=''
itcast = request.args.get("itcast")
age = request.args.get("age")
# print(itcast)
# print(age)
# 输出请求的url地址
# print(request.url) # http://127.0.0.1:5000/?itcast=python18&age=18
# 输出请求的http请求方法
# print(request.method) # GET
# 输出请求头
# print(request.headers)
return 'hello world'
# form是指表单参数的请求
# get请求参数长度是有限制的,浏览器限制;
# post请求参数是没有限制的。
# http://127.0.0.1:5000/?itcast=
# http://127.0.0.1:5000/form/
@app.route("/form/",methods=['GET','POST'])
def demo_form():
# 获取表单参数
# abc = request.form.get('abc')
# print(abc)
# 获取多个表单参数
itcast = request.form.get('itcast')
age = request.form.get('age')
print(itcast)
print(age)
return 'demo form'
# 获取文件
@app.route('/files',methods=['POST'])
def save_files():
# 获取文件对象
image = request.files.get("image")
# 保存文件
image.save('./666.jpg')
return 'save files success'
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
三、脚本管理器
通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。而不仅仅通过app.run()方法中传参,比如我们可以通过:
python hello.py runserver -host ip地址
Flask-Script 还可以为当前应用程序添加脚本命令
from flask import Flask
# 使用脚本管理器:可以运行项目,指定ip和port,可以实现数据库的迁移,添加自定义命令
from flask_script import Manager
app = Flask(__name__)
# 实例化管理器对象,让管理器和程序实例进行关联
manage = Manager(app)
@app.route('/')
def index():
return 'hello world'
if __name__ == '__main__':
# app.run(debug=True)
# 使用管理器对象,调用run方法,启动服务器
# 可以在终端启动项目时,手动指定ip和port。
manage.run()