Flask框架

1,513 阅读4分钟

1. Flask简介

Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。

Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。

Werkzeug(路由模块),模板引擎Jinja2,这两个是 Flask 框架的核心。

2. 简易运行

导入Flask类

from flask import Flask

Flask函数接收一个参数__name__,它会指向程序所在的包

app = Flask(__name__)

装饰器的作用是将路由映射到视图函数 index

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

Flask应用程序实例的 run 方法 启动 WEB 服务器

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

在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来

3. 相关参数

  • __name__,在静态文件中没有其名字的话,就会默认在代码窗口所在的路劲查找静态文件
  • static_url_path:静态文件访问路径,可以不传,默认为:/ + static_folder
  • static_folder:静态文件存储的文件夹,可以不传,默认为 static
  • template_folder:模板文件存储的文件夹,可以不传,默认为 templates
  • 从配置对象中加载(常用):app.config.form_object()
  • 从配置文件中加载:app.config.form_pyfile()
  • 从环境变量中加载(了解):app.config.from_envvar()
  • 在 Flask 中,定义一个路由,默认的请求方式为:GET
  • 返回JSON:return jsonify(json_dict)
  • 重定向:url_for
  • 重定向到自己写的视图函数,可以直接填写自己 url 路径,也可以使用 url_for 生成指定视图函数所对应的 url:return redirect(url_for('demo1'))
  • 在 Flask 中,可以很方便的返回自定义状态码,以实现不符合 http 协议的状态码,例如:status code: 666

系统自带转换器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

4. 异常捕获

  • abort 方法:抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。
  • 参数:code – HTTP的错误状态码
  • errorhandler 装饰器:注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法
  • 参数: code_or_exception – HTTP的错误状态码或指定异常

5. 请求勾子

before_first_request:在处理第一个请求前执行

before_request:在每次请求前执行

如果在某修饰的函数中返回了一个响应,视图函数将不再被调用

after_request:如果没有抛出错误,在每次请求后执行

接受一个参数:视图函数作出的响应

在此函数中可以对响应值在返回之前做最后一步修改处理

需要将参数中的响应在此参数中进行返回

teardown_request:

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

6. 获取请求参数

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

7. 状态保持

无状态: 每次请求都是一次新的请求,人生若只如初见

实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie
  • 在服务器端存储信息使用Session

7.1 Cookie

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

# 设置cookie

from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'itcast')
    return resp
# 设置过期时间
@app.route('/cookie')
def set_cookie():
    response = make_response('hello world')
    response.set_cookie('username', 'itheima', max_age=3600)
    return response
获取cookie

from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

7.2 Session

  • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session
  • Session依赖于Cookie
# session:请求上下文对象,用于处理http请求中的一些数据内容

@app.route('/index1')
def index1():
    session['username'] = 'itcast'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')

8. 上下文

请求上下文:

  • request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
  • session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。

应用上下文:

  • current_app:应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量
  • g变量:g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

两者区别:

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