Flask基础(二)

Flask中的路由参数

# ----------------- Flask中的路由参数 -----------------------
@app.route('/', endpoint="end_a", defaults={"count": 20}, strict_slashes=True, redirect_to='/',methods=["GET","POST","options"])
# endpoint     反向url地址,必须唯一,默认为视图函数名(url_for)。相当于Django的name
# methods      当前url地址允许访问的请求方式,支持HTTP/1.1八中标准请求方式,不分大小写 ["GET","Post"]
# defaults     路由默认参数,需要和函数配合使用
# strict_slashes  是否严格遵循路由匹配规则,默认是True
# redirect_to     访问该路由时直接重定向到指定地址
# 动态参数路由    "/get_music/<filename>",可以分页,获取文件,解决分类,解决正则路由问题

 

Flask初始化配置

# ----------------- Flask初始化配置 ------------------
app = Flask(__name__,template_folder="templates",static_folder="img",static_url_path="/static")
# template_folder="templates"    模板文件存放路径
# static_folder="img"            静态文件存放目录,默认值是static
# static_url_path="/static"      静态文件访问路径,默认值是 / + static_folder
# 上面两个静态文件逻辑可参考下面函数
@app.route("/static/<filename>")
def get_img(filename):
    filepath = os.path.join("img",filename)
    return send_file(filepath)

 

Flask实例配置 -> app的配置

# 第一种直接在app中进行配置:app.config
app.config["DEBUG"] = True
app.secret_key = "!@#!@$@#%#$%^#@#$!$"
app.session_cookie_name = "I am Not session"
app.permanent_session_lifetime = 20  # 这里是秒
# 第二种,写一个setting配置,然后导入使用即可
# setting文件中:
class TestConfig(object):
    TESTING = True
    SECRET_KEY = hashlib.md5("{time.time()}@#$!#$!@$!!%$%#$@^@%${time.time()}".encode("utf-8")).hexdigest()
    PERMANENT_SESSION_LIFETIME = 360000
    SESSION_COOKIE_NAME = "#$!#$!@#$!#@$@#%"
# app中使用
app.config.from_object(TestConfig)

 

Flask 中的 蓝图 Blueprint (app01)

不能被run的Flask实例,不存在Config,也就没有run。只能在Flask中引用蓝图进行使用

蓝图的使用方法和Flask相似:

  1. 导入模块

  2. 为当前蓝图命名

  3. 在Flask中进行引用

示例:

# 创建蓝图文件:users.py
from flask import Blueprint
​
car_bp = Blueprint("app02",__name__,url_prefix="/car")  # 实例化一个蓝图对象(Blueprint),url_prefix为url命名前缀
​
@car_bp.route("/add_user")
def add_user():
    return "car添加用户"
​
@car_bp.route("/find_user")
def find_user():
    return "car查看用户"# 在Flask中进行使用:t3.py
from users import car_bp  # 导入蓝图
app.register_blueprint(car_bp)  # 引用蓝图。引用蓝图后直接输入蓝图路由即可访问,如:主机/add_user
                                # 如果蓝图有url_prefix则需要加上url前缀,如:主机/car/add_user

 

特殊装饰器

装饰器名称装饰器作用
@app.before_request 在请求进入视图函数之前做出处理
@app.after_request 在响应返回客户端之前,结束视图函数之后
@app.errorhandler(404) 返回收集错误信息并返回,只能收集4xx,5xx

@app.before_request

在请求进入视图函数之前做出处理

@app.after_request

在响应返回客户端之前,结束视图函数之后

be+af请求生命周期:

正常:be1 - be2 -vf -af2 - af1

异常:be1 - af2 - af1

只要有响应,af全部返回(在before_request遇到问题直接跳过视图函数,进行after_request)。流程图如下:

 

 

示例代码:访问index页面,分别设置返回be1或be2,看后台打印运行流程


from flask import Flask, render_template, send_file, session
​
app = Flask(__name__,template_folder="templates",static_folder="img",static_url_path="/static")
​
from setting import DebugConfig,TestConfig  # 导入配置文件
app.config.from_object(DebugConfig)   # 使用配置文件
from users import bp    # 导入蓝图
from car_users import car_bp
app.register_blueprint(bp)   # 使用蓝图
app.register_blueprint(car_bp)
​
@app.before_request
def be1():
    print("I am Be1")
    return "第一个请求你就过不去"
​
@app.before_request
def be2():
    print("I am Be2")
    # return "第二个请求你过不去"
​
@app.after_request
def af1(res):
    print("I am af1")
    return res
​
@app.after_request
def af2(res):
    print("I am af2")
    return res
​
@app.errorhandler(404)
def error404(error_message):
    print(error_message)
    return "你的页面被哥斯拉吃了"
    # return send_file("img/1.jpg")  # 同样有五种返回结果
​
​
@app.route("/index")
def index():
    print("index页面")
    return "这是一个index页面"if __name__ == '__main__':
    app.run()

 

posted @ 2020-04-14 23:41  无夜。  阅读(89)  评论(0)    收藏  举报