路由基本定义

  • 明确路由定义的参数,请求方式指定


指定路由地址

# 指定访问路径为 demo1
@app.route('/demo1')
def demo1():
    return 'demo1'

给路由传参示例

有时我们需要将同一类 URL 映射到同一个视图函数处理,比如:使用同一个视图函数来显示不同用户的个人信息。

# 路由传递参数
@app.route('/user/<user_id>')
def user_info(user_id):
    return 'hello %s' % user_id
  • 路由传递的参数默认当做 string 处理,也可以指定参数的类型

# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):
    return 'hello %d' % user_id

这里指定int,尖括号中的内容是动态的,在此暂时可以理解为接受 int 类型的值,实际上 int 代表使用 IntegerConverter 去处理 url 传入的参数

指定请求方式

在 Flask 中,定义一个路由,默认的请求方式为:

  • GET

  • OPTIONS(自带)

  • HEAD(自带)

如果想添加请求方试,那么可以如下指定:

@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
    # 直接从请求中取到请求方式并返回
    return request.method


============================================================

============================================================


视图常用逻辑

  • 返回 JSON

  • 重定向

    • url_for

  • 自定义状态码

返回JSON

在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应

# 返回JSON
@app.route('/demo4')
def demo4():
    json_dict = {        
    "user_id": 10,        
    "user_name": "laowang"
    }    
    return jsonify(json_dict)

不推荐使用 json.dumps 转成 JSON 字符串直接返回,因为返回的数据要符合 HTTP 协议规范,如果是 JSON 需要指定 content-type:application/json

重定向

  • 重定向到百度官网

# 重定向
@app.route('/demo5')
def demo5():
    return redirect('http://www.baidu.com')
  • 重定向到自己写的视图函数

    • 可以直接填写自己 url 路径

    • 也可以使用 url_for 生成指定视图函数所对应的 url

@app.route('/demo1')
def demo1():
    return 'demo1'# 重定向
    
@app.route('/demo5')
def demo5():
    return redirect(url_for('demo1'))
  • 重定向到带有参数的视图函数

    • 在 url_for 函数中传入参数

# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):
    return 'hello %d' % user_id
    
# 重定向
@app.route('/demo5')
def demo5():
    # 使用 url_for 生成指定视图函数所对应的 url
    return redirect(url_for('user_info', user_id=100))

自定义状态码

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

@app.route('/demo6')
def demo6():
    return '状态码为 666', 666



============================================================

============================================================

HTTP 异常主动抛出

  • abort 方法

    • 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。

  • 参数:

    • code – HTTP的错误状态码

# abort(404)abort(500)

抛出状态码的话,只能抛出 HTTP 协议的错误状态码

捕获错误

  • errorhandler 装饰器

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

  • 参数:

    • code_or_exception – HTTP的错误状态码或指定异常

  • 例如统一处理状态码为500的错误给用户友好的提示:

@app.errorhandler(500)def internal_server_error(e):
    return '服务器搬家了'
  • 捕获指定异常

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