Loading

Flask学习笔记(3)

重定向

要将用户重定向到另一个端点,请使用 redirect() 函数

from flask import redirect

@app.route('demo')
def demo():
    return redirect('https://www.baidu.com')

返回 JSON

import json

from flask import Flask, jsonify

@app.route('/demo')
def demo():
    json_dict = {
        "user_id": 10,
        "user_name": "zhangsan"
    }
    return json.dumps(json_dict)
    # return jsonify(json_dict)

注意:

return json.dumps() 和 return jsonify()的区别在与return jsonify() 会设置响应头 Content-Type:application/json。

自定义状态码和响应头

元组方式

可以返回一个元组,元组必须是(response, status, headers)的形式,且至少包含一个元素。status 值会覆盖状态码,headers 可以是一个列表或字典。

@app.route('/')
def index():
    # return '状态码为404', 404
    # return '状态码为404', 404, [('name', 'zhangsan')]
    return '状态码为404', 404, {'name': 'lisi'}

make_response

from flask import Flask, make_response
@app.route('/')
def index():
    res = make_response('测试 make_response')
    res.headers['language'] = 'python'
    res.status = " 404"
    return res

cookie 是从响应中得到的,所以我们可以在 Flask 返回的响应中即 make_response 中设置 cookie。要设置 cookie,可以使用 set_cookie 方法。

@app.route('/set_cookie')
def set_cookie():
    res = make_response('set cookie ok')
    res.set_cookie('username', 'aaa')
    return res

设置 cookie 过期时间:

from datetime import datetime

res.set_cookie('username', 'aaa', max_age=3600)  # 设置cookie 3600秒过期
res.set_cookie('userage', "18", expires=datetime(2021, 2, 1))  # 设置cookie,2021年2月1后过期
@app.route('/get_cookie')
def get_cookie():
    res = request.cookies.get('username')
    return res
@app.route('/delete_cookie')
def delete_cookie():
    res = make_response('hello world!')
    res.delete_cookie('username')
    return res

session

需要先设置 SECRET_KEY

class DefaultConfig(object):
    SECRET_KEY = 'gha2il4pm6le7jf'

app.config.from_object(DefaultConfig)
# 或者直接设置
app.secret_key='gha2il4pm6le7jf'

设置 session

@app.route('/set_session')
def set_session():
    session['username'] = 'zhangsan'
    return 'set session ok'

读取 session

@app.route('/get_session')
def get_session():
    username = session.get('username')
    return 'get session username {}'.format(username)

删除 session

有以下三种方式删除 session

session.pop(key)
del session[key]
session.clear()

异常处理

异常主动抛出

abort 方法

抛出一个给定状态码的 HTTPException 或者指定响应。

abort(500)

示例:

@app.route('/test_abort')
def test_abort():
    user_id = request.args.get('user_id')
    if user_id is None:
        abort(400)
    return 'user id {}'.format(user_id)

捕获错误

errorhandler 装饰器

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

统一处理状态码为 500 的错误:

@app.errorhandler(500)
def internal_server_error(e):
    print(e)
    return '服务器找不到了'

捕获指定的异常:

@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):
    print(e)
    return '除数不能为0'

请求钩子

请求钩子指的是在执行视图函数前后执行的一些函数,例如:在处理第一个请求时,建立数据库连接,在每次请求开始前,根据需求进行权限检验,在请求结束时,指定数据的交互格式等。

Flask 提供了以下四种请求钩子:

  • before_first_request:在处理第一次请求前执行,可以做一些初始化的操作。
  • before_request:在每次请求前执行。
  • after_request:如果没有抛出错误,在每次请求之后调用。
  • teardown_request:在每次请求之后调用,会接受一个参数,参数是服务器出现的错误信息。

示例:

# 在第一次请求之前调用
@app.before_first_request
def before_first_request():
    print('before_first_request')


# 在每一次请求前都会执行
@app.before_request
def before_request():
    print('before_request')


# 在请求之后运行
@app.after_request
def after_request(response):
    print('after_request')
    response.headers["Content-Type"] = "application/json"
    return response


# 在每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(error):
    print('teardown_request: {}'.format(error))

上下文

flask 中有两种上下文:请求上下文和应用上下文

请求上下文

在 flask 中,直接使用 request 这个对象获取相关的数据,request 对象就是请求上下文的对象,保存了本次请求的相关数据,请求上下文对象有:request 和 session。

  • request:封装了 HTTP 请求的内容,针对的是 http 请求。
  • session:用来记录请求会话中的信息,针对的是用户信息。

应用上下文

应用上下文对象有:current_app、g

current_app

应用程序上下文,用于存储应用程序中的变量,可以通过 current_app.name 打印当前 app 的名称,也可以在 current_app 中存储一些变量。

示例:

app.py

import json
from datetime import datetime

from flask import Flask, request, abort
from werkzeug.routing import BaseConverter

app = Flask(__name__)

app.user_info = 'user info'

@app.route('/user')
def get_user_id():
    user_id = request.args.get('user_id')
    print(app.user_info)
    if user_id is None:
        abort(400)
    return 'user id {}'.format(user_id)


from user import bp

app.register_blueprint(bp)

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

user.py

from flask import Blueprint, current_app
bp = Blueprint('user', __name__)


@bp.route('/bp')
def view_func():
    print(current_app.name)
    print(current_app.user_info)
    return 'ok'

作用:current_app 就是当前运行的 flask app,在不方便操作 flask 的 app 对象时,可以操作 current_app 就等价于操作 app 对象。

g 对象

g 作为 flask 程序全局的临时变量,我们可以通过它在一次请求调用的多个函数间传递一些数据。每次请求都会重设这个变量。

from flask import Flask, g

app = Flask(__name__)

def query_user():
    uid = g.user_id
    uname = g.user_name
    print('user_id = {},user_name={}'.format(uid, uname))

@app.route('/')
def get_user_frofile():
    user_id = 123
    user_name = '小明'
    g.user_id = user_id
    g.user_name = user_name
    query_user()

    return 'Hello World!'

if __name__ == '__main__':
    app.run(debug=True)
posted @ 2021-08-27 19:47  charlatte  阅读(35)  评论(0编辑  收藏  举报