python -- (Flask简介) --(三)

1. 捕获异常的方法

  • HTTP 异常主动抛出

    • abort方法,抛出一个给定状态代码的 HTTPException : abort(500)
  • 捕获错误

    • errorhandler 装饰器:注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
  • 状态码的捕获

@app.route('/demo1')
def demo1():
    # 主动抛出HTTP指定错误状态码
    abort(404)
    return 'demo1'


# 使用装饰器的形式去捕获指定的错误码和异常
@app.errorhandler(404)
def page_not_found(error):
    return "唉,页面不见了~"
  • 错误捕获
@app.route('/demo1')
def demo1():
    # 主动抛出HTTP指定错误状态码
    # abort(404)
    a = 0
    b = 1 / a
    return 'demo1'


@app.route(ZeroDivisionError)
def zero_division_error(error):
    return "除数不能为0"

2. 请求钩子函数

  • before_first_request
    • 在处理第一个请求前执行
  • before_request
    • 在每次请求前执行
    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用
  • after_request
    • 如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值在返回之前做最后一步修改处理
    • 需要将参数中的响应在此参数中进行返回
  • teardown_request
    • 在每次请求后执行
    • 接受一个参数:错误信息,如果有相关错误抛出
from flask import Flask

app = Flask(__name__)


@app.before_first_request
def before_first_request():
    """在第一次请求之前会访问该函数"""
    print("before_first_request")


@app.before_request
def before_request():
    """在每次请求之前都会调用"""
    print("before_request")
    # 可以对一些非法的请求进行阻止
    # if 如果ip在黑名单:
    #     return "你在~~~"


@app.after_request
def after_request(response):
    """在请求之后会调用,并且函数里面接受一个参数: 响应,还需要将响应进行返回"""
    print('after_request')
    # 可以在此函数中对响应数据做统一处理
    return response


@app.teardown_request
def teardown_request(error):
    """在请求之后会执行,如果请求的函数报有异常,会把具体异常传入到此函数"""
    print("teardown_request")


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


if __name__ == '__main__':
    app.run(debug=True)
  • 在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request
  • 在第2次请求时的打印:
before_request
after_request
teardown_request

3. 获取请求参数的方法

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

在这里插入图片描述

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

4. 状态保持

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

Cookie

  • Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
    • 复数形式Cookies。
    • Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
    • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
    • Cookie的key/value可以由服务器端自己定义。
      在这里插入图片描述
设置cookie
from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('user_id', '1')
    return resp
设置cookie 过期时间
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('user_id', '1', max_age=3600)
    return response
获取cookie
from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('user_id')
    return resp

Session

  • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session
  • Session依赖于Cookie
    在这里插入图片描述
from flask import Flask, session

app = Flask(__name__)
# 设置 session 的话,需要配置 secret_key
app.config['SECRET_KEY'] = 'sdsfdfdf'


@app.route('/')
def index():
    user_id = session['user_id']
    user_name = session['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_name')
    return 'success'
 
 
if __name__ == '__main__':
    app.run(debug=True)

5. 上下文

请求上下文(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中存储一些变量,例如:
      • 应用的启动脚本是哪个文件,启动时指定了哪些参数
      • 加载了哪些配置文件,导入了哪些配置
      • 连了哪个数据库
      • 有哪些public的工具类、常量
      • 应用跑再哪个机器上,IP多少,内存多大
  • g变量
    • g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

两者区别:

  • 请求上下文:保存了客户端和服务器交互的数据
  • 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

6. Flask-Script 扩展

通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。

from flask import Flask
from flask_script import Manager


app = Flask(__name__)
# 把 Manager 类和应用程序实例进行关联
manager = Manager(app)


@app.route('/')
def index():
    return '床前明月光'


if __name__ == "__main__":
    manager.run()

---------------------------------------------------END-----------------------------------------------
---------------------------------------------------END-----------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值