作者:Belief | 来源:互联网 | 2023-10-12 20:00
Flask中的路由系统其实我们并不陌生了,例如下面的路由从一开始到现在都一直在应用app.route(,methods[GET,POST])Flask中除了这种直接路
Flask中的路由系统其实我们并不陌生了, 例如下面的路由从一开始到现在都一直在应用
@app.route("/",methods=["GET","POST"])
Flask中除了这种直接路由方法外, 还有一种蓝图路由方法,可以更好的规划路由.
路由设置方法
Flask中的路由设置方法有直接路由法和蓝图路由法两种方法.
直接路由法
methods
methods 指定视图函数的请求方式,默认GET
endpoint
endpoint可以解决自定义装饰器导致的视图函数的重名问题
示例: 如下程序视图函数"detail"和"index"都用到了自定义装饰器wai, 因此运行过程中两个视图函数都被改名为wai导致了程序出错. 而endpoint可以重新定义视图函数名,从而又改正视图函数名.
from flask import Flask, request, session, redirect, render_template
app = Flask(__name__, template_folder='templates')
app.secret_key = 'my_secret_key'
# 装饰器函数
def wai(func):
def inner(*args, **kwargs):
if session.get('user'):
ret = func(*args, **kwargs)
return ret
else:
return redirect('/login')
return inner
@app.route('/', endpoint='index')
@wai # 会把函数index当成wai中的inner
def index(nid):
return render_template('index.html')
@app.route('/login', methods=('GET', 'POST'), strict_slashes=False)
def login():
if request.method == 'GET':
return render_template('login.html')
else:
session['user'] = request.form.get('user')
return redirect('/')
@app.route('/detail', endpoint='detail')
@wai
def detail():
return render_template('detail.html')
if __name__ == '__main__':
app.run(debug=True)
关于视图函数中的url补充问题:
- flask允许两个路由访问同一个视图函数。操作方法如下:
@app.route("/index")
@app.route("/default")
def index():
return "Hello!!"
- 路由route("/index")和 route("/index/")的区别
- route("/index/")在访问时浏览器地址可以是否输入最后的"/"都可以访问
- route("/index")在访问时浏览器地址输入最后的"/"都不可以访问
url_for
url_for 反向获取路由地址
from flask import Flask, url_for
app = Flask(__name__)
@app.route("/", endpoint="index1", )
def index():
print(url_for("index1")) # url_for用于反向生成路由地址
print(url_for(endpoint="index1"))
return "hahha!"
app.run(debug=True)
运行结果:
动态路由参数
/ / / 参数添加在路由中后,视图函数中需要有参数接收动态路由参数,此时访问url为 "url/动态参数"
- 动态参数只能为int型
- 动态参数为字符串
- 动态参数为字符串
程序示例:
原本url为 http://127.0.0.1:5000/
现在url应该使用为: http://127.0.0.1:5000/124即可访问页面, "124"也可以随便为其他字符串.
@app.route('/', endpoint='index')
@wai # 会把函数index当成wai中的inner
def index(nid):
return render_template('index.html')
如果index函数中没写参数nid, 访问会报错如下:
defaults
defaults={"nid":1} 指定视图函数的默认参数
strict_slashes
参数strict_slashes决定访问url时是否严格遵循路由规则. 以示例地址http://127.0.0.1:5000/login为例
- strict_slashes=True 严格遵循路由规则 , 不可以访问到/login/, 只能访问到/login
- strict_slashes=False 不严格遵循路由规则, 可以访问 /login/, 可以访问到/login
@app.route('/login', methods=('GET', 'POST'), strict_slashes=False)
def login():
if request.method == 'GET':
return render_template('login.html')
else:
session['user'] = request.form.get('user')
return redirect('/')
redirect_to
redirect_to="/login" 永久跳转地址 301
例如当网站有新地址后,可以给老地址加"redirect_to"使其跳转到新地址.
加蓝图路由法
蓝图路由法相比于直接路由法最大的优点是可以很好的按模块规划路由
蓝图可以设置自己的"template_folder", 但是不要和其他的html文件重名
蓝图路由参数"url_prefix"既可以在蓝图实例化设置也可以在蓝图注册时设置.
程序示例:
运行结果:
蓝图Blueprint详解
蓝图,听起来就是一个很宏伟的东西
在Flask中的蓝图 blueprint 也是非常宏伟的
它的作用就是将 功能 与 主服务 分开,即功能隔离,怎么理解呢?
比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将查看客户、修改客户、添加客户、删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做一个这样的例子,但是首先我们要搞清楚什么是蓝图 blueprint。
进一步学习 >>> 点击
蓝图示例
使用步骤
- 实例化路由以及配置路由参数
- 导入路由并且注册路由
- 访问
程序示例:
程序运行后:
蓝图实例参数
通过以上的例子, 我们如何理解蓝图呢?
其实我们可以理解成一个没有run方法的Flask对象, 只要Blueprint被 Flask 注册了,就一定会生效. 这个理论虽然有很多的漏洞, 但是对于刚接触蓝图的你来说, 就这么样理解比较简单.
- # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates
- # 静态文件目录也是可以独立出来的
from flask import Blueprint # 导入 Flask 中的蓝图 Blueprint 模块
from flask import render_template
sv = Blueprint("sv",
__name__,
template_folder="sv_template", # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates
static_folder="sv_static", # 静态文件目录也是可以独立出来的
url_prefix="/user" # 路径规划,可以让本蓝图的路径都在"/user"下,避免url重复
) # 实例化一个蓝图(Blueprint)对象
@sv.route("/svlist")
def view_list():
return render_template("svlist.html")
注意!!!!!!!!!!!!!!!!!!
- 蓝图内部的视图函数及route如果出现重复的url, 则优先使用外部url. 因此项目中需要用到url_prefix参数规划蓝图路径
- 蓝图涉及的url_prefix参数既可以在蓝图实例化的时候设置,也可以在蓝图注册的参数中设置.