跟我学Flask(六)-状态保持-上下文对象-脚本管理器

一、状态保持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()

猜你喜欢

转载自blog.csdn.net/qq_36217796/article/details/83825392
今日推荐