Python - 路由

路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程。路由工作在OSI参考模型第三层——网络层的数据包转发设备。路由器通过转发数据包来实现网络互连。

Python 路由是将 URL 直接映射到创建网页的代码的机制。它有助于更好地管理网页结构并显着提高网站的性能,进一步的增强或修改变得非常简单。 在 python 中,路由是在大多数 Web 框架中实现的。 我们将在本章中看到来自 flask Web 框架的示例。


Flask 中的路由

Flask 中的 route() 装饰器用于将 URL 绑定到函数。 结果,当浏览器中提到 URL 时,将执行该函数以给出结果。 在这里,URL '/hello' 规则绑定到 hello_world() 函数。 因此,如果用户访问 http://localhost:5000/ URL,hello_world() 函数的输出将呈现在浏览器中。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'Hello Tutorialspoint'

if __name__ == '__main__':
   app.run()

当运行上面的程序时,得到以下输出 −

 * Serving Flask app "flask_route" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [06/Aug/2018 08:48:45] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [06/Aug/2018 08:48:46] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [06/Aug/2018 08:48:46] "GET /favicon.ico HTTP/1.1" 404 -

我们打开浏览器并指向 URL http://localhost:5000/ 以查看函数执行的结果。

routing_1.png

使用 URL 变量

我们可以使用路由传递 URL 变量以动态构建 URL。 为此,使用 url_for() 函数,该函数接受函数名称作为第一个参数,其余参数作为 URL 规则的可变部分。

在下面的示例中,我们将函数名称作为参数传递给 url_for 函数,并在执行这些行时打印出结果。

from flask import Flask, url_for
app = Flask(__name__)

@app.route('/')
def index(): pass

@app.route('/login')
def login(): pass

@app.route('/user/')
def profile(username): pass

with app.test_request_context():
    print url_for('index')
    print url_for('index', _external=True)
    print url_for('login')
    print url_for('login', next='/')
    print url_for('profile', username='Tutorials Point')

当运行上面的程序时,得到以下输出 −

/
http://localhost/
/login
/login?next=%2F
/user/Tutorials%20Point

重定向

我们可以使用重定向功能通过路由将用户重定向到另一个 URL。 我们提到新 URL 作为函数的返回值,whihc 应该重定向用户。 当我们在修改现有网页时临时将用户转移到不同的页面时,这很有用。

from flask import Flask, abort, redirect, url_for
app = Flask(__name__)

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

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

执行上述代码时,基本 URL 转到使用 abort 函数的登录页面,因此永远不会执行登录页面的代码。