一 路由
1 endpoint:反向URL地址,默认为视图函数名(url_for)
1.endpoint 反向生成URL from flask import url_for 默认视图函数
@app.route("/info", methods=["GET", "POST"], endpoint="r_info")
def student_info():
print(url_for("r_info"))# /info
stu_id = int(request.args["id"])
return f"Hello Old boy {stu_id}" # Python3.6的新特性 f"{变量名}"
2 defaults:视图函数的默认参数 默认值{'nid':1}
from flask import url_for @app.route("/info", methods=["GET", "POST"], endpoint="r_info", defaults={"nid": 100}) #注意:默认参数nid 要放入到函数括号里面 def student_info(nid): print(url_for("r_info")) # /info # stu_id = int(request.args["id"]) print(nid) # 100 #打印一下nid return f"Hello Old boy {nid}" # Python3.6的新特性 f"{变量名}"
3 methods 允许的请求方式 默认GET请求,有多种请求参数['GET']
from flask import Flask @app.route("/info", methods=["GET", "POST"]) #methods中的多种请求方式 def student_info(): return f"Hello Old boy" # Python3.6的新特性 f"{变量名}"
4 strict_slashes=False是否严格遵循路由地址 当strict_slashes=False时,URL地址/index访问时可以是/index 或/index/ , 为True时,URL地址/index ,访问时必须是/index,后面不能加/,否则无法访问。也就是说URL地址结尾符‘/’的控制
False:无论结尾‘/’是否存在均可访问,
True:结尾必须不能是'/'
#访问地址 /index @app.route("/index", strict_slashes=True) def index(): return "Hello" # 访问地址 : /index or /index/ @app.route("/index", strict_slashes=False) def index(): return "Hello"
5 redirct_to URL地址重定向
from flask import Flask #访问地址: /index 跳转到/login @app.route("/index", strict_slashes=True, redirect_to="/login")
#当访问/index时 就会重定向到/login中 def index(): return "Hello" @app.route("/index", strict_slashes=False) def index(): return "Hello"
6 动态参数路由
from flask import url_for # 访问地址 : http://127.0.0.1:5000/index/1 app =Flask(__name__) @app.route('/index/<int:nid>',methods=['GET','POST') def index(nid): #注意nid 要写入括号里 return f'Hello {nid}'
7 子域名前缀 subdomian='mmdkdd' 这样可以得到
mmdkdd.baidu.com 前提是app.config['SERVER_NAME']=‘baidu.com’
from flask import Flask app=Flask(__name__) @app.route('/index',subdomain='mmdkdd') #子域名前缀 def index(): return 'Hello' #访问地址是: mmdkdd.baidu.com/index
二 Flask的实例化配置
1 template_folder='templates' templates 是默认模板存放目录,当模板存放目录名不是
templates时,需要指定其template_folder
from flask import Flask,render_template app = Flask(__name__,template_folder="temp") #注意这里的temp是你自己定义的模板目录 #当你的模板文件名不是templates时 要写template_folder, 告知pycharm 你的模板目录是哪个 @app.route("/index/<page>",methods=["GET","POST"],endpoint="index") def index(): print(page,type(page)) return "123" @app.route("/login",methods=["GET","POST"]) def login(): return render_template("index.html") if __name__ == '__main__': app.run("0.0.0.0",5000,debug=True)
2 static_folder='static' static是默认静态文件的存放目录
from flask import Flask,render_template app = Flask(__name__,template_folder="temp", static_folder="static") #注意 这里的static是默认静态文件的存放目录,
#当静态文件的名字不是static时 将其static_folder='static' 中的static 换成改名字就行 @app.route("/index/<page>",methods=["GET","POST"],endpoint="index") def index(): # print(page,type(page)) return "123" @app.route("/login",methods=["GET","POST"]) def login(): return render_template("index.html") if __name__ == '__main__': app.run("0.0.0.0",5000,debug=True)
3 static_url_path='/static' 静态文件访问路径 其实就是相当于 '/' + static_folder
二 Flask的对象配置
1 app= Flask(__name__)
2 app.config.from_obj(class)
from flask import Flask app = Flask(__name__,template_folder="temp", static_folder="static") import FlaskSetting app.config.from_object(FlaskSetting.FlaskDebug) #注意这里的FlaskSetting是自己创建的文件名 里面写的代码如下图 # app.config.from_object(FlaskSetting.FlaskTesting) #同上
三 Flask中的蓝图(blueprint)
蓝图当成是一个app
作用:将功能与主服务分开
比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将
查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做一个这样的例子,但是首先我们要搞清楚什么是蓝图 blueprint
1 初识蓝图(blueprint)
首先 创建一个项目
1 创建一个项目student_view,在其目录下新建一个py文件 s_view.py
from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块 sv = Blueprint("sv", __name__) # 实例化一个蓝图(Blueprint)对象 @sv.route("/svlist") # 这里添加路由和视图函数的时候与在Flask对象中添加是一样的 def view_list(): return "svlist_view_list"
在不同的目录中有一个mana.py文件
内容为
from flask import Flask
# 导入此前写好的蓝图模块
from student_view import s_view
app = Flask(__name__) # type:Flask
# 在Flask对象中注册蓝图模块中的蓝图对象 s_view 中的 sv
app.register_blueprint(s_view.sv)
app.ru(debug=True)
# 现在Flask对象中并没有写任何的路由和视图函数
开启服务,然后访问 http://127.0.0.1:5000/svlist 查看结果
四 特殊装饰器
1 before_request 在请求进入视图函数之前
2 after_request 在响应返回客户端之前
from flask import Flask app = Flask(__name__) @app.before_request # 请进入视图函数之前 def be1(): print("我是 before_request1") @app.before_request # 请进入视图函数之前 def be2(): print("我是 before_request2") return render_template("error.html") # HTTPResponse("请使用合法客户端") @app.before_request # 请进入视图函数之前 def be3(): print("我是 before_request3") @app.after_request # 在响应客户端之前 def af1(args): print("我是 after_request1") return args @app.after_request # 在响应客户端之前 def af2(args): print("我是 after_request2") return args @app.after_request # 在响应客户端之前 def af3(args): print("我是 after_request3") return args app.run(debug=True)
注意:执行顺序为
正常时:be1 - be2 - be3 - af3 - af2 - af1
异常时:be1 - af3 - af2 - af1
3 errorhandler 重定向错误信息
from flask import Flask app = Flask(__name__) @app.route("/login") def login(): session["user"] = "123456" return "登录成功" @app.errorhandler(404) def error404(): return "你访问的页面已经被怪兽吃了" if __name__ == '__main__': app.run(debug=True)