• 「Flask」路由+视图函数


    路由

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

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

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

    静态路由

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

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

    装饰器的重要参数

    methods 参数

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

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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 参数来选择正确的视图函数。

    from flask import Flask
    app = Flask(__name__)
    @app.route('/hello', endpoint='hello_world')  
    def hello_world():  
        return 'Hello, World!'
    if __name__ == '__main__':
      app.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    url_for 装饰器

    url_for 是一个用于生成 URL 的装饰器,接受函数名作为为第一个参数,返回的是该函数对应的装饰器的路径,主要是配合redirect()函数的使用

    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/')
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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是从客户端发往服务器的请求
    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('/', 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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    Java 多线程编程核心技术有哪些
    [附源码]计算机毕业设计springboot面包连锁店管理系统
    可分离卷积核
    腾讯罗嘉黎:基于APM的腾讯可观测平台技术与实践
    【JavaScript原型链prototype详解】
    Java 中的设计模式
    (c语言)初识结构体
    Ubuntu22.04 安装配置流水账
    Python教程:itertools模块
    多校数学部分补题
  • 原文地址:https://blog.csdn.net/weixin_51216553/article/details/134367357