「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()
相关推荐
代码的乐趣16 分钟前
支持selenium的chrome driver更新到131.0.6778.204
chrome·python·selenium
又蓝41 分钟前
使用 Python 操作 Excel 表格
开发语言·python·excel
余~~185381628001 小时前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
m0_748257181 小时前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
ROBOT玲玉2 小时前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
小_太_阳2 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
Kai HVZ3 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神3 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode