Python day39_Flask入门

异常捕获

自定义状态码

在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 888

只要在return 后面 添加即会返回你想定义的状态码,具体应用在异常捕获中

异常

两种异常:一种是主动抛出异常,一种是程序出错抛出异常

一:主动抛出404错误

需要导入abort 模块和使用装饰器errorhandler传入异常状态码

@app.route('/abort')
def hello_world():
    # 如果不用装饰器 就会抛出NOT FOUND error
    return abort(404)

# 使用装饰器 捕获404错误
@app.errorhandler(404)
# 定义函数,传入error信息,此时的error信息是404error 信息
def error_info(error):
    # 返回用户友好界面 ,传入自定义状态码 
    return 'the page is not found ',404

错误捕获的时候, 需要自定义状态码. 否则会显示默认的200(不需要200, 而是返回实际的404)

二 : 捕获数据错误

@app.route('/div')
def div_data():
    a = 1/0
    return a

@app.errorhandler(ZeroDivisionError)
def error_div(error):
    return '除数不能为0',500

请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持四种请求钩子

before_first_request

在处理第一个请求前执行

before_request

在每次请求前执行
如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 如后台管理权限

after_request

如果没有抛出错误,在每次请求后执行
接受一个参数:视图函数作出的响应 response
在此函数中可以对响应值在返回之前做最后一步修改处理
需要将参数中的响应在此参数中进行返回

teardown_request

在每次请求后执行
接受一个参数:错误信息,如果有相关错误抛出 error

上下文

上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。

Flask中有两种上下文,请求上下文和应用上下文

请求上下文(request context)

在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据。

请求上下文对象有:request、session

request

封装了HTTP请求的内容,针对的是http请求,request 就是flask中代表当前请求的 request 对象

需要导入模块 request

常用属性:

Python day39_Flask入门_第1张图片
06.JPG

需要结合postman 使用

@app.route('/index',methods=['GET', 'POST'])
def index():
    print(request.method)
    print(request.headers)
    print(request.url)

    print(request.args)
    print(request.form.get('name'))

    print(request.data)
    image_file = request.files.get('pic')
    image_file.save('./static/girl.jpg')
    print(request.files)

    return 'Hello World!'

session

说到session 就得说下cookie

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

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

Cookie应用场景:

最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。

网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。

购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。

注意:

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

Cookie基于域名安全,不同域名的Cookie是不能互相访问的
如访问taobao时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到taobao写的Cookie信息

浏览器的同源策略

当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

@app.route('/login')
def hello():
    # 为了有状态保持, 我们需要存储一些有用的信息cookie(浏览器) 
    # 需要导入make_reponse
    res = make_response('hello world')
    # set_cookie(key, value, 有效期)
    res.set_cookie('name','zhangsan',max_age = 3600)
    # 获取cookie的具体数据
    print(request.cookies.get('name'))
    return res

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息

在服务器端进行状态保持的方案就是Session

Session依赖于Cookie

session数据的获取

需要导入seesion模块

需要设置 secret_key: app.secret_key = '字符串'

app.secret_key = 'sixi'
@app.route('/set_session')
def set_session():
    # 设置session
    session['age'] = '18'
    return 'set_session'
@app.route('/get_session')
def get_session():
    # 获取session的值
    age = session.get('age')
    return 'age is %s' % age
@app.route('/delete_sess')
def delete_sess():
    # 删除session
    session.pop('age',None)
    return 'delete session'

你可能感兴趣的:(Python day39_Flask入门)