Flask要点快读

python2 文档:http://docs.jinkan.org/docs/flask/

python3 文档:https://dormousehole.readthedocs.io/en/latest/installation.html#python

如果你和我一样,明天就要面试,或者马上要上手一个 Flask 项目,而你又有那么一段时间没有使用 Flask,那么这篇快读会带你将 Flask 中的要点进行快速翻阅,话不多说,我们开始吧。

一、动态路由[配合converter]

1
2
3
4
@app.route('/index/<int:id>/<string:name>')
def index(id,name):
print(type(id),type(name))
return '<p>提交的ID为{id},name为{name}'.format(id=id,name=name)

二、url_for

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@app.route('/url1')
def url1():
pass

@app.route('/url2')
def url2():
u1 = url_for('url1', test='123')
i1 = url_for('index', id=1, name='2')
i2 = url_for('index', id=1, name='2', _external=True) # 输出绝对路径
html = '''
<p>u1 ----- {u1}</p>
<p>i1 ----- {i1}</p>
<p>i2 ----- {i2}</p>
'''.format(u1=u1, i1=i1, i2=i2)
return html

三、请求与响应/自定义状态码/cookie与session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@app.route('/url3')
def url3():
num = request.args.get('num')
response = make_response('<h1>OK<h1>', 200)
response.set_cookie('num', num)
session['num'] = num
return response


@app.route('/url4')
def url4():
numCookie = request.cookies.get('num')
numSession = session.get('num')
return numCookie + numSession
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 请求相关
request.method:获取请求方法
request.json.get("json_key"):获取json数据 **较常用
request.argsget('name') :获取get请求参数
request.form.get('name') :获取POST表单请求参数
request.form.getlist('name_list'):获取POST表单请求参数列表(如多选)
request.values.get('age') :获取GET和POST请求携带的所有参数(GET/POST通用)
request.cookies.get('name'):获取cookies信息
request.headers.get('Host'):获取请求头相关信息
request.path:获取用户访问的url地址,例如(/,/login/,/ index/);
request.full_path:获取用户访问的完整url地址+参数 例如(/login/?name=wd)
request.url:获取访问url地址,例如http://127.0.0.1:5000/?name=18
request.base_url:获取访问url地址,例如 http://127.0.0.1:5000/;
request.url_root:不带参数的根url,例如 http://127.0.0.1:5000/;
request.host_url:不带参数的根host,当使用ip方式访问的时候同url_root例如 http://127.0.0.1:5000/;
request.host:获取主机地址
request.files:获取用户上传的文件
obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename)) 直接保存文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 响应相关
################基本响应类型
return "字符串" :响应字符串
return render_template('html模板路径',**{}):响应模板
return redirect('/index.html'):跳转页面
##############JSON格式响应
@app.route('/login', methods=['GET', 'POST'])
def login():
response = Response(json.dumps({"status":"ok"}), mimetype="application/json;charset=utf-8")
return response
##################设置响应信息
response = make_response(render_template('index.html’)) #也可以相应模版
response.delete_cookie('key’) #删除cookie中的一个key
response.set_cookie('key', 'value’) #设置cookie
response.headers['username'] = ‘wd’ #设置响应头信息
return response

四、重定向/Abort/自定义错误页面/render_template/jinjia2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@app.route('/url5')
def url5():
if session.get('flag'):
session.pop('flag')
session.clear()
abort(404)
return '200 OK'
session['flag'] = 1
return redirect('http://www.baidu.com')

@app.errorhandler(404)
def pageError(error):
Title = 'NOT FOUND'
content = {'context':'没有找到','error':error}
return render_template('notFound.html',Title=Title,content=content),404

notFound.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ Title }}</title>
</head>
<body>
<h1>{{ content.context }}</h1>
{% if content %}
<h1>{{ content.error }}</h1>
{% endif %}
</body>
</html>

五、jinjia语句/宏/模板/上下文

​ 略,这块东西内容多信息量不大

六、请求勾子

  • before_first_request

    • 在处理第一个请求前执行
  • before_request

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

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

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

    代码测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 在第一次请求之前调用,可以在此方法内部做一些初始化操作
    @app.before_first_request
    def before_first_request():
    print("before_first_request")

    # 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
    # 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
    @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(e):
    print("teardown_request")

七、Flask-WTF/CSRF/消息闪现Flash

八、Flask-Moment本地化日期和时间

九、蓝图

十、Flask-mail

十一、Flask-Login

十二、Werkzeug 加密存储

十三、itsdangerous 用户确认

十四、jsonify

十五、Flask-sqlalchemy

1
pip install flask-sqlalchemy

十六、富文本编辑器之MD

十七、Flask-Apscheduler 定时任务

十八、Flask-Script

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

1
pip install flask-script
集成 Flask-Script
1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

@app.route('/')
def index():
return '买买大帅比'

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

https://www.cnblogs.com/glf1160/p/9214106.html

十九、Flask-Migrate(依赖flask-script)

二十、Flask-Celery-Helper

二十一、Flask-Cache

二十二、Flask-Principal

二十二、Flask-Bcrypt

二十三、Flask-Admin

其他

  • Flask 中的 线程局部变量 request 原理

    在多线程服务器中客户端每建立一个链接,服务器就创建一个线程,每个线程中就会有一个 request 来表示客户端的链接请求信息。

    不同的用户访问flask服务器.都有自己的 request.

    Flask 隐藏了一个细节 ,线程 A 使用如 request.args 时,它先看这段代码当中运行到哪个线程,识别出这个线程,

    从 request 当中根据当前这个线程的编号,把属于这个线程的参数值拿出来.

  • 安装

    • 依赖

      当安装 Flask 时,以下配套软件会被自动安装。

      • Werkzeug 用于实现 WSGI ,应用和服务之间的标准 Python 接口。
      • Jinja 用于渲染页面的模板语言。
      • MarkupSafe 与 Jinja 共用,在渲染页面时用于避免不可信的输入,防止注入攻击。
      • ItsDangerous 保证数据完整性的安全标志数据,用于保护 Flask 的 session cookie.
      • Click 是一个命令行应用的框架。用于提供 flask 命令,并允许添加自定义 管理命令。
    • virtualenv

      Python 3 内置了用于创建虚拟环境的 venv 模块。

      创建一个虚拟环境

      创建一个项目文件夹,然后创建一个虚拟环境。创建完成后项目文件夹中会有一个 Flask 文件夹:

      在 Windows 下:

      1
      2
      3
      mkdir myproject
      cd myproject
      python3 -m venv Flask
      激活虚拟环境

      在 Windows 下:

      1
      venv\Scripts\activate

      激活后,你的终端提示符会显示虚拟环境的名称。

      安装 Flask

      在已激活的虚拟环境中可以使用如下命令安装 Flask:

      1
      pip install Flask

      当安装速度缓慢时,你也可以进行换源安装:

      1
      pip install -i https://pypi.doubanio.com/simple/ Flask
  • 系统自带转换器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    DEFAULT_CONVERTERS = {
    'default': UnicodeConverter,
    'string': UnicodeConverter,
    'any': AnyConverter,
    'path': PathConverter,
    'int': IntegerConverter,
    'float': FloatConverter,
    'uuid': UUIDConverter,
    }

###

本文结束 感谢您的阅读
坚持原创技术分享,您的支持将鼓励我继续创作!