路由
路由的作用是将 HTTP 请求的 URL 路径映射到相应的函数处理程序。这样我们在开发过程中,就能将不同的 URL 路径与相应的函数处理程序关联起来,从而实现对 Web 应用的灵活控制。
路由可以分为静态路由和动态路由。两者主要是在形式上有一些区别,通常静态路由使用 @app.route('/') 这样的装饰器形式。
而动态路由会使用变量名 ,形式通常为 @app.route('/', )。当然,其中还可以传入其他类型的参数,如整型、浮点型,甚至 Path 路径等。
静态路由
路由的装饰器形式是 @app.route('/'),装饰器中的第一个参数是 '/',括号当中的斜杠表示项目根路径。
静态路由的工作机制很容易理解:在我们的项目开发过程中,都是在根路径的基础上去修改 URL,对于不同的 URL 需要使用装饰器的方式来绑定不同的视图函数。
装饰器的重要参数
methods 参数
methods 是当前视图函数支持或者说函数指定的 HTTP 请求方法,比如POST
、GET
等
py
from flask import Flask, request
app = Flask(__name__)
@app.route('/message', methods=['POST'])
def message():
name = request.form['name']
location = request.form['location']
age = request.form['age']
return f'Hi, {name} ,you have live in {location} for {age} years!'
if __name__ == '__main__':
app.run()
methods 参数主要用来指定函数的请求方法。在上面的案例中,路由装饰器的 methods 参数指定 message() 函数使用 POST 请求方法。在 message() 函数里的参数 name、location、age 使用 request 方法从表单中获取数据,message() 函数最后返回了表单中的名字、地址和年龄。
当用户在提交表单数据的时候,(你可以理解为前端设计了一个小框,你在框内输入东西然后点击回车,这个过程就是在提交表单数据,即POST),Flask 会自动调用视图函数 message(),并且从请求当中获取提交的数据。最后,我们将提交的数据返回并展示给用户。这就是 methods 核心作用。
endpiont 函数
Flask 路由装饰器 @app.route 中的 endpoint 参数是一个函数,用于指定要处理的 URL 的名称。这个参数可以是一个字符串,用于匹配要处理的 URL,也可以是一个函数,用于生成 URL
简单来说,就是指定该路由装饰器会调用哪个函数,本来不指定endpoint 的时候都会默认认为该路由是下面的函数,如果添加了endpoint参数,就会调用指定的函数,主要作用是实现函数的复用,可以让 Flask 能够处理相同 URL 的请求。比方说,如果有多个处理相同 URL 的视图函数,但是它们使用不同的 endpoint 参数,Flask 就会根据传入的 endpoint 参数来选择正确的视图函数。
py
from flask import Flask
app = Flask(__name__)
@app.route('/hello', endpoint='hello_world')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
url_for 装饰器
url_for 是一个用于生成 URL 的装饰器,接受函数名作为为第一个参数,返回的是该函数对应的装饰器的路径,主要是配合redirect()函数的使用
py
from flask import Flask, escape, url_for
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login():
return 'login'
@app.route('/user/<username>')
def profile(username):
return '{}\'s profile'.format(escape(username))
# url_for可以规定这些函数的url地址
with app.test_request_context():
print(url_for('index')) #输出/
print(url_for('login')) #输出/login
print(url_for('login', next='/')) #输出/login?next=%2F
print(url_for('profile', username='John Doe')) # 输出/user/John%20Doe
redirect_to
redirect_to 是重定向装饰器。当用户点击路由跳转链接时,浏览器会发送一个 HTTP 重定向请求,Flask 路由装饰器 redirect_to 可以捕获这个重定向请求,并将用户重定向到目标 URL。
应用 redirect_to 装饰器的重点,就是了解它需要接收一个参数,这个参数就是重定向后要跳转到的目标 URL,会直接跳到这个重定向后的URL
通常配合url_for使用,因为url_for会返回一个URL,而redirect_to需要传的就是一个URL路径
request对象
request 是一个非常有用的对象,它包含了客户端与服务器之间的所有请求和响应数据。
在 Flask 中,视图函数的 request 对象通常是由客户端发送给服务器的第一个请求对象,它包含了客户端发送给服务器的所有数据,比如后面这些信息。
- 请求头信息:如 Accept、Content-Type 等
- 请求的 URL 参数 request.url
- 发送给服务器的请求体数据 request.json
- 请求方法 request.method
- 表单数据,即 POST 请求中传递的数据 request.form
案例实战
- get 输入到URL内,按下回车,request相当于是URL内的东西,客户端会从URL内得到request,所以是服务器到客户端
- post,我们在框内输入,按下回车,相当于客户端发往服务器了,request是从客户端发往服务器的请求
py
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route('/')
def index():
return render_template('practice_2_index.html')
@app.route('/<code>', methods=['GET'])
def check_(code):
Cipher = '路由装饰器'
if request.method == 'GET' and code == Cipher:
return '使用GET方法,口令正确'
else:
return redirect(url_for('failure'))
@app.route('/check', methods=['POST'])
def check():
Cipher = '路由装饰器'
ci = request.form.get('cipher')
if request.method == 'POST' and ci == Cipher:
return redirect(url_for('success'))
else:
return redirect(url_for('failure'))
@app.route('/success')
def success():
return '暗号对接成功!'
def failure():
return '暗号对接失败!'
if __name__ == '__main__':
app.run()