URL和重定向

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/

区分两条路由

  1. /projects/(末尾带斜杠)
    可以类比文件夹。访问 /projects 时,Flask 发起301重定向,浏览器地址栏自动补全末尾 /
  2. /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)
  1. url_for('函数名') 自动反向解析路由,生成对应的访问路径;
  2. 优势:后续修改路由地址时,不需要全局改动所有链接,只需要修改@app.route内的路径;
  3. 搭配 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 自动根据路由规则生成最新地址。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注