使用简记
最简单的Flask程序
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def index():
return "hello world"
if __name__ == '__main__':
app.run()
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 配置文件
主流的就两种
- 一种基于全局变量 > settings.py localsettings.py
- 一种基于类的方式 > settings.py里面写三个类 BaseSettings、DevSettings、ProdSettings
1
2
3
2
3
# 模版和静态文件
app = Flask(__name__,template_folder='templates',static_folder='static')
<img src="{{ url_for('static',filename='keep1.png')}}" alt=""> # xx/xx/keep1.png
1
2
3
2
3
# 路由
@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():pass
- ★ flask的路由是装饰器
- 三个参数 url methods endpoint
注意,若不写methods参数,默认仅支持GET请求
注意,endpoint用于反向生成路由 若不写,其默认值就是视图函数名; ★ endpoint的值不要重名,否则会报错!!
基于Flask路由的本质,路由还有种写法!!
def index():
return render_template('index.html')
app.add_url_rule('/index', 'index', index) # 路由、name、视图函数
Flask还有CBV的写法,有一点很好玩,它可以设定装饰器!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 视图函数返回值
from flask import Flask, render_template, jsonify, redirect, url_for
@app.route('/login')
def login():
return "hello world"
# def render_template(template_name_or_list, **context) >> 向模版传递数据 **dic 或者 data=xx
return render_template('login.html')
return redirect('/index') # return redirect(url_for('index')) -- url_for搭配endpoint > 反向生成路由
return jsonify({'code': 200, 'data': [1, 2, 3]})
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 路由参数的传递和接收
@app.route('/delete/<nid>') # nid值的类型是str <a href="/delete/{{ k }}">删除</a>
def delete(nid):pass
@app.route('/delete/<int:nid>') # nid值的类型是int <a href="/delete/{{ k }}">删除</a>
def delete(nid):pass
@app.route('/login')
def login():
request.args # GET形式传递的数据 - ?params -- <a href="/delete?nid={{ k }}">删除</a>
request.form # POST形式传递的数据 - 请求体数据
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 模版使用
{{ x }}
{% for item in data_list %}
{{ item }}
{% endfor %}
flask的模版中的注释
<!-- <td>{{ key }}</td> --> 不生效!!
{# <td>{{ key }}</td> #} 生效!!
字典取键值对, Django的模版 data_dict.items 不加括号; flask模版中 data_dict.items() 需要加括号
字典取值, Django的模版 v.name ; flask模版中 v.name、v["name"]、v.get('name',"未知") 皆可
在flask模版中列表直接通过下标取值!
{% extends 'layout.html' %}
{% block content %} {% endblock %}
def f(name, age): # return render_template('index.html',f=f) {{f("dc",18)}}
return f"Hello {name}-{age}!"
# !! 若使用了蓝图, 那么 定义全局模板方法 的应用范围只有本蓝图!!
@app.template_global() # {{f1('2','3')}} - 若想为所有模版提供一些公用的方法,就使用它!!就没必要每个模版都传这个方法了.
def f1(a, b):
return 'f1' + a + b
@app.template_filter() # {{ "4"|f2("5","6") }}
def f2(a, b, c):
return 'f2' + a + b + c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Session的使用
app.secret_key = "abcdefghijklmnop" # ★ flask使用session,必须设置secret_key这个盐
from flask import Flask, session
session['username'] = 'dc' # 设置session
username = session.get("username") # 读取session
flask的session认证/会话信息保持
注-@auth需写在@app.route('/index')下方且@auth需要@functools.wraps(func) 不然用于反向生成路由的endpoint会重名,报错!!
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 特殊的装饰器 - 中间件
@app.before_request
def f2():
print('f2')
@app.after_request
def f20(response):
print('f20')
return response
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 蓝图
小蓝图、大蓝图
1