「Flask」路由+视图函数

路由

路由的作用是将 HTTP 请求的 URL 路径映射到相应的函数处理程序。这样我们在开发过程中,就能将不同的 URL 路径与相应的函数处理程序关联起来,从而实现对 Web 应用的灵活控制。

路由可以分为静态路由和动态路由。两者主要是在形式上有一些区别,通常静态路由使用 @app.route('/') 这样的装饰器形式。

而动态路由会使用变量名 ,形式通常为 @app.route('/', )。当然,其中还可以传入其他类型的参数,如整型、浮点型,甚至 Path 路径等。

静态路由

路由的装饰器形式是 @app.route('/'),装饰器中的第一个参数是 '/',括号当中的斜杠表示项目根路径。

静态路由的工作机制很容易理解:在我们的项目开发过程中,都是在根路径的基础上去修改 URL,对于不同的 URL 需要使用装饰器的方式来绑定不同的视图函数。

装饰器的重要参数

methods 参数

methods 是当前视图函数支持或者说函数指定的 HTTP 请求方法,比如POSTGET

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 对象通常是由客户端发送给服务器的第一个请求对象,它包含了客户端发送给服务器的所有数据,比如后面这些信息。

  1. 请求头信息:如 Accept、Content-Type 等
  2. 请求的 URL 参数 request.url
  3. 发送给服务器的请求体数据 request.json
  4. 请求方法 request.method
  5. 表单数据,即 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()
相关推荐
2501_9032386525 分钟前
自定义登录页面的Spring Security实践
java·后端·spring·个人开发
weixin_3077791337 分钟前
流媒体娱乐服务平台在AWS上使用Presto作为大数据的交互式查询引擎的具体流程和代码
大数据·python·音视频·aws
職場上的造物主1 小时前
高清种子资源获取指南 | ✈️@seedlinkbot
python·ios·php·音视频·视频编解码·视频
〖是♂我〗2 小时前
自定义数据集 使用scikit-learn中svm的包实现svm分类
开发语言·python
抱抱宝2 小时前
Pyecharts之特殊图表的独特展示
python·信息可视化·数据分析
一 乐2 小时前
基于vue船运物流管理系统设计与实现(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端·船运系统
deephub3 小时前
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
python·机器学习·gil
沈韶珺3 小时前
Elixir语言的安全开发
开发语言·后端·golang
MatpyMaster4 小时前
基于PyQt5打造的实用工具——PDF文件加图片水印,可调大小位置,可批量处理!
python·pdf
go54631584654 小时前
python 从知网的期刊导航页面抓取与农业科技相关的数据
开发语言·python·科技