路由

现代 Web 应用的 URL 十分优雅,易于人们辨识记忆,这一点对于那些面向使用低速网络连接移动设备访问的应用特别有用。如果可以不访问索引页,而是直接访问想要的那个页面,他们多半会笑逐颜开而再度光顾。

如上所见,route()装饰器把一个函数绑定到对应的 URL 上。

这里是一些基本的例子:

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World'
但是,不仅如此!你可以构造含有动态部分的 URL,也可以在一个函数上附着多个规则。

变量规则[关键字传参,默认传参,指定类型传参]

要给 URL 添加变量部分,你可以把这些特殊的字段标记为, 这个部分将会作为命名参数传递到你的函数。规则可以用指定一个可选的转换器。这里有一些不错的例子:

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

转换器有下面几种: | Type | Meaning| | :---: | :--: | | int | 接受整数 |
| float | 同int,但是接受浮点数 | | path |和默认的相似,但也接受斜线 |

1. 带不带 最后的斜杠区别

带 你访问带不带无所谓 但是你不带. 你访问带斜杠 则报错 404

2. 唯一 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'

虽然它们看起来着实相似,但它们结尾斜线的使用在 URL定义中不同。 第一种情况中,指向projects的规范 URL 尾端有一个斜线。这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被 Flask 重定向到带斜线的规范 URL 去。

然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。

这个行为使得在遗忘尾斜线时,允许关联的 URL 接任工作,与 Apache 和其它的服务器的行为并无二异。此外,也保证了 URL 的唯一,有助于避免搜索引擎索引同一个页面两次。

构造 URL(通过 def 来找路由 反过来的反向解析)

我们使用 方法url_for url_for 参数写方法的名字 print 一个url_for 你发现它返回的是对应的url

如果 Flask 能匹配 URL,那么 Flask 可以生成它们吗?当然可以。你可以用url_for()来给指定的函数构造 URL。它接受函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到 URL 末尾作为查询参数。这里有一些例子:

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...
>>> with app.test_request_context():
...  print url_for('index')
...  print url_for('login')
...  print url_for('login', next='/')
...  print url_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe

(这里也用到了test_request_context()方法,下面会解释。即使我们正在通过 Python 的 shell 进行交互,它依然会告诉 Flask 要表现为正在处理一个请求。请看下面的解释。环境局部变量)

为什么你要构建 URL 而非在模板中硬编码?这里有三个绝妙的理由:

反向构建通常比硬编码的描述性更好。更重要的是,它允许你一次性修改 URL, 而不是到处边找边改。 URL 构建会转义特殊字符和 Unicode 数据,免去你很多麻烦。 如果你的应用不位于 URL 的根路径(比如,在/myapplication下,而不是/),url_for()会妥善处理(路径)这个问题。

HTTP 方法

HTTP (与 Web 应用会话的协议)有许多不同的访问 URL 方法。默认情况下,路由只回应GET请求,但是通过route()装饰器传递methods参数可以改变这个行为。这里有一些例子:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

重定向和错误

你可以用redirect()函数把用户重定向到其它地方。放弃请求并返回错误代码,用abort()函数。这里是一个它们如何使用的例子:

from flask import abort, redirect, url_for

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

这是一个相当无意义的例子因为用户会从主页重定向到一个不能访问的页面 (401 意味着禁止访问),但是它展示了重定向是如何工作的。

默认情况下,错误代码会显示一个黑白的错误页面。如果你要定制错误页面, 可以使用errorhandler()装饰器:

from flask import render_template

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

注意render_template()调用之后的404。这告诉 Flask,该页的错误代码是 404 ,即没有找到。默认为 200,也就是一切正常。

Copyright © shxdledu.cn 2018 all right reserved,powered by Gitbook该文件修订时间: 2019-04-09 11:32:22

results matching ""

    No results matching ""