Flask 的 URL 规则基于 Werkzeug 的路由模块。
这个模块背后的思想是基于 Apache 以及更早的 HTTP 服务器主张的用法,保证优雅且唯一的 URL。
例子
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'Code language: JavaScript (javascript)
讲解
第一个例子:@app.route('/projects/')
原则上我们访问http://127.0.0.1:5000/projects/
能正常打开。
当我们访问不带/的地址的时候,比如http://127.0.0.1:5000/projects
则地址会被自动重定向到带斜线的http://127.0.0.1:5000/projects/
区分两条路由
/projects/(末尾带斜杠)
可以类比文件夹。访问/projects时,Flask 发起301重定向,浏览器地址栏自动补全末尾/。/about(末尾不带斜杠)
可以类比文件。如果你访问/about/,匹配失败,直接返回404页面。
核心目的
保证唯一URL,避免搜索引擎把 /projects 和 /projects/ 判定成两个不同页面,防止SEO权重分散。
url_for
可以用 url_for() 来给指定的函数构造 URL。
它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。
未知变量部分会添加到URL末尾作为查询参数。这里有一些例子:
例子
from flask import Flask,url_for,redirect
app = Flask(__name__)
@app.route('/')
def index():
login_url = url_for('login')
# return redirect(login_url)
return u'这是首页' + login_url
@app.route('/login/')
def login():
return u'这是登陆页面'
if __name__ == '__main__':
app.run()Code language: PHP (php)
url_for('函数名')自动反向解析路由,生成对应的访问路径;- 优势:后续修改路由地址时,不需要全局改动所有链接,只需要修改
@app.route内的路径; - 搭配
redirect()函数,可以实现页面跳转。
url_for的作用
现在登录路由是:
@app.route('/login/')
def login():
return '登录页'
Code language: JavaScript (javascript)
项目很多地方跳转登录,你全都这么写:
return redirect("/login/")
Code language: JavaScript (javascript)
需求变更!
产品要求:把登录地址改成 /signin/
@app.route('/signin/')
def login():
return '登录页'
Code language: JavaScript (javascript)
如果你硬写地址:
所有页面写死的 /login/ 全部失效!你要在整个项目里到处查找、修改,漏一处就报错。
如果你用 url_for (“login”)
只改路由这一行,别的代码完全不用动!
url_for 自动根据路由规则生成最新地址。
Previous: 路由变量
Next: HTTP的methods