更新于 

Flask Start

此教程内容涉及内容很浅,仅为快速上手Flask提供关键注意要点

项目配置(针对Pycharm)
  1. 开启debug 热更新模式

    edit configurations > FLASK_DEBUG = on

  2. 修改flask项目运行的host

    edit configurations > Additional options = –host=0.0.0.0

  3. 修改flask项目运行的port

    edit configurations > Additional options = –host=0.0.0.0 –port=8060

关于flask:debug模式的开启
  • 方式一
    1
    app.run(debug=True)
  • 方式二
    • 配置系统环境变量为flask开发模式
    • 配置系统换环境变量,打开flask调试模式
      1
      2
      3
      import os
      os.environ["FLASK_ENV"] = 'development'
      os.environ["FLASK_DEBUG"] = '1'

URL与视图的映射

url的组成

http://127.0.0.1:5000/abc/

url一般由三部分组成:

  • 协议
    • http(80)/https(443)
    • 访问域名时,下面两种方式的含义相同:
  • ip/域名
  • 路由
初始化文件
1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, request, render_template
from datetime import datetime
# __name__表示当前模块名 app为中心调用对象
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'hello'

# 排除引用触发运行的情况
if __name__ == '__main__':
app.run()
路由映射配置
1
2
3
@app.route('/path')  # 路由配置
def path_mapping(): # 映射函数
return 'render content' # 返回渲染内容

在访问装饰器配置的路由时,会执行下方的函数,函数返回值就是渲染内容

template

flask的template引入是通过Jinjia模板引擎的

仅需要在flask项目下的 /templates 文件夹中加入对应html模板,
然后在路由映射函数的返回值中使用flask.render_template(‘指定模板.html’)

route+template实例演示

路由传参

定义时使用 <> 包裹变量名称,
在映射函数的参数中加入对应变量名称,
在映射函数被调用时,传入变量值,参数会通过url传入

1
2
3
@app.route('/user/<id>')
def user(id):
return f"Welcome, user {id}"

<参数类型:参数名称>

1
2
3
@app.route('/page/<int:page_num>')
def page(page_num):
return f"page {page_num}"

通过 /path?key1=value1?key2=value2 的格式传递的参数都存储在 request.args
request 需要从 flask 内引入

1
2
3
4
5
@app.route('/list/')
def list():
page = request.args.get('page', 1)
return f"list page: {page}"

模板

需要从flask中引入render_template方法

1
2
 <!--template/index.html-->
<h1>Jinjia2 template</h1>
1
2
3
@app.route('/path')
def get_path_template():
return render_template('index.html')

render_template(url[,**args])

index.html
1
2
<h1>{{title}}</h1>
<p>{{content}}</p>
路由配置
1
2
3
@app.route('/path/<title>/<content>')
def path_render(title, content):
return render_template('index.html', title=title, content=content)
index.html
1
2
3
<body>
{{ user.name }} / {{ user.email }}
</body>
路由配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 类定义
class User:
def __init__(self, **args):
self.name = args["name"]
self.email = args["email"]

@app.route("/path")
def path_render():
user = User(
name=request.args.get("name", "default name"),
email=request.args.get("email", "123456@default.com")
)
# 可变参数也通过关键字指定方式传参
return render_template('index.html', user=user)
jinjia语法
过滤器语法
1
<h1>{{ 变量名|指定过滤器 }}</h1>

jinjia提供了如下这些过滤器:

jinjia提供的过滤器
jinjia提供的过滤器

自定义过滤器需要用到add_template_filter方法

1
2
3
# filter_fun 过滤器方法,入参为被过滤的值,返回过滤后值
# filter_name 过滤器名称
app.add_template_filter(filter_fun, filter_name)

下面提供的是一个对datetime类型数据进行格式化的自定义过滤器:

index.html
1
2
3
<body>
{{ mytime|dformat }}
</body>
路径映射
1
2
3
4
5
6
7
8
9
10
# 1 定义过滤器
def data_format(time, format="%Y-%m-%d""):
return time.strftime(format)
# 2 绑定过滤器到app
app.add_template_filter(data_format, 'dformat')
# 3 路由映射中使用
@app.route('/path')
def path_render():
mytime = datatime.now()
return render_template('index.html', mytime=mytime)

jinjia模板中提供两种基本的流程控制语句:

  • if-else

    1
    2
    3
    4
    5
    6
    7
    {% if exp_A %}
    ...
    {% elif exp_B %}
    ...
    {% else exp_C %}
    ...
    {% endif %}
  • for-in

    1
    2
    3
    {% for i in arr %}
    ...
    {% endfor %}

用法类似于slot插槽
父模块里加入命名插槽:

父模块中定义插槽
1
{% block 插槽名 %}{% endblock %}

子模块中使用插槽名定位插槽插入

子模块中接入插槽
1
2
{% extends '父模块.html' %}
{% block 插槽名 %}...{% endblock %}

需要用到url_for方法
jinjia模板通过url_for获取静态文件的默认地址在template同级目录下的static文件夹中
有如下目录结构:

  • static
    • css
      • index.css
    • img
      • toby_dog.jpg
    • js
      • main.js
  • templates
    • static.html

url_for方法的作用是:根据视图函数的名称生成url

1
2
3
#  "static"表示路径static
# filename表示文件路径
url_for("static", filename)
1
2
3
4
5
6
7
8
9
10
11
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{{url_for("static", filename="css/index.css")}}">
<script src="{{url_for("static", filename="js/main.js")}}"></script>
</head>
<body>
<img src="{{url_for("static", filename="img/toby_dog.jpg")}}" alt="">
</body>
</html>