Flask 路由及蓝图

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# 路由
# methods 配置请求允许方式 是复数也就是一个可迭代对象 ["GET", "POST"]
# endpoint 反向解析url地址的标志 默认是视图函数名 url_for()解析
# defaults 配置视图函数的默认参数值 defaults={"page": "22"}
# strict_slashes 是否严格遵循路由地址 默认是True 访问/index/1 会自动跳转到/index/1/
# redirect_to 永久重定向 301

@app.route('/index/<int:page>/', methods=['GET', 'POST'], endpoint='index')
def index(page):
# print(page, type(page)) # 接收的默认是字符串类型
# print(url_for('index', page=page))
# print(get_flashed_messages(category_filter="tag"))
# print(get_flashed_messages(category_filter="tag1"))
return 'This is %s page' % page

# flask实例化配置
# template_folder="templates" 配置模板路径
# static_folder="static" 配置静态文件路径
# static_url_path="/static" 配置静态文件路由地址 默认是"/"+static_folder
# static_host=None 配置静态文件服务器地址
# host_matching=False 需要先配置server_name
# subdomain_matching=False 需要先配置server_name
# instance_path=None 配置另外一个flask实例的路径
# instance_relative_config=False 是否加载另外一个flask实例配置
# root_path=None 配置主模块的绝对路径 默认是项目目录
# subdomain=None 配置通过子域名访问

from flask import Flask

app = Flask(__name__)
app.config["SERVER_NAME"] = "pg.top:5000"


@app.route("/index", subdomain="index")
# 通过 index.pg.top:5000/index 访问
# subdomain 配置子域名
def index():
print("index")
return "index"


@app.route("/space", subdomain="<username>")
# 通过 lp.pg.top:5000/space 访问
# 通过 xs.pg.top:5000/space 访问
def userspace(username):
return username + ".pg.top"


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

app = Flask(__name__, template_folder="templates", static_folder="static", static_url_path="/static")

# flask对象app配置
# app.debug=False 是否开启调试模式
# app.testing=False 是否开启测试模式
# app.secret_key 配置使用内置session/flash 时加密字符串
# app.permanent_session_lifetime=31 配置session生命周期 天为单位 默认31天
# app.session_cookie_name 配置在cookie中存放session加密字符串的名字

class FlaskDebug(object):
DEBUG = True
SECRET_KEY = "debugjiamizifuchuan"
PERMANENT_SESSION_LIFETIME = 7
SESSION_COOKIE_NAME = "Debug_Session"

# 通过类方式导入配置
app.config.from_object(FlaskDebug)

# 蓝图
# Blueprint 实际是一个不能被启动app flask实例
# url_prefix="/stu" 配置url前缀

from flask import Blueprint
stu = Blueprint("stu", __name__)

@stu.route("/home")
def index():
return "这是stu首页"

# app中需要注册蓝图
app.register_blueprint(student.stu)

# 闪现 在session中存储一个暑假,读取是通过pop将数据移除
from flask import flash
# 存闪现并打个标签
flash("闪现", "tag")
flash("闪现12", "tag1")

# 通过标签取闪现
get_flashed_messages(category_filter="tag")
get_flashed_messages(category_filter=["tag", "tag1"])

# 中间件 用户发送请求时 执行__call__方法
# class MiddleWare(object):
# def __init__(self, old_app):
# self.old_app = old_app
# def __call__(self, environ, start_response):
# print("执行前")
# ret = self.old_app(environ, start_response)
# print("执行后")
# return ret
#
#
# if __name__ == '__main__':
# app.wsgi_app = MiddleWare(app.wsgi_app)
# app.run(host="192.168.3.20")

# 特殊装饰器函数
# 请求进入视图之前
@app.before_first_request
def bfr1():
print("首次请求前执行")

@app.before_request
def br1():
print("每次请求前执行")
# return "请求不合法!"
err = "请求不合法!"
# return render_template("error.html", err_msg=err)

# 在响应之前
@app.after_request
def ar1(args):
print("每次响应之前执行")
print(args)
return args

# 正常情况下 before_request 自上而下执行 after_request 自下而上执行
# 异常情况下 before_request1 after_request 自下而上执行

# 自定义404错误页
@app.errorhandler(404)
def error404(err_info):
print(err_info)
return render_template("404.html")