五、Flask的请求和响应方法与常用技巧

简介: 五、Flask的请求和响应方法与常用技巧

1、请求方法

1)、request.method

描述:获取当前请求的 HTTP 方法。

用法示例:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        # 处理 GET 请求
        pass
    elif request.method == 'POST':
        # 处理 POST 请求
        pass
2)、request.args

描述:获取 GET 请求中的查询参数。

用法示例:

@app.route('/search')
def search():
    keyword = request.args.get('keyword')
    # 处理查询参数
    pass
3)、request.form

描述:获取 POST 请求中的表单数据。

用法示例:

@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')
    # 处理表单数据
    pass
4)、request.files

描述:获取请求中上传的文件。

用法示例:

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files.get('file')
    if file:
        # 处理上传的文件
        pass
5)、request.cookies

描述:获取请求中的 Cookies。

用法示例:

@app.route('/')
def index():
    username = request.cookies.get('username')
    # 处理 Cookies
    pass

2、响应方法

1)、return ‘text’

描述:返回纯文本响应。

用法示例:

@app.route('/')
def index():
    return 'Hello, World!'
2)、return render_template(‘template.html’, context)

描述:使用模板引擎渲染 HTML 模板,并返回响应。

用法示例:

@app.route('/user/<username>')
def user(username):
    return render_template('user.html', username=username)
3)、return jsonify(data)

描述:返回 JSON 响应。

用法示例:

@app.route('/api/data')
def api_data():
    data = {'name': 'John', 'age': 30}
    return jsonify(data)
4)、return redirect(‘url’)

描述:重定向到指定的 URL。

用法示例:

@app.route('/redirect')
def redirect_example():
    return redirect('/new-url')
5)、return make_response(‘text’, status_code)

描述:构造自定义的响应对象。

用法示例:

from flask import Flask, make_response
app = Flask(__name__)
@app.route('/custom_response')
def custom_response():
    response_content = 'This is a custom response.'
    status_code = 200  # HTTP 状态码
    response = make_response(response_content, status_code)
    return response

Flask 请求和响应方法的原理分析

请求的原理
  • 当用户发送 HTTP 请求到 Flask 应用时,Flask 会根据请求的 URL 和请求方法(GET、POST 等)匹配到相应的路由。
  • 一旦匹配到路由,Flask 将创建一个 Request 对象,该对象封装了与请求相关的信息,如请求的 URL、请求方法、请求头、请求体等。
  • Request 对象经过一系列处理流程,包括路由处理函数、请求钩子、中间件等,最终被传递给路由处理函数进行处理。
  • 路由处理函数根据业务逻辑处理请求,并生成相应的数据。
  • Flask 将生成的数据封装成一个 Response 对象。
响应的原理
  • 在路由处理函数中,可以通过返回字符串、模板渲染、JSON 数据等方式生成响应数据。
  • Flask 将生成的响应数据封装成一个 Response 对象,该对象包含了响应的内容、状态码、头部信息等。
  • 在返回 Response 对象之前,Flask 可以通过请求钩子、中间件等机制对响应进行处理和修改。
  • 最终,Flask 将 Response 对象发送给客户端,完成响应过程。
Flask 请求和响应方法的工作流程
  • 客户端发送 HTTP 请求到 Flask 应用。
  • Flask 应用根据请求的 URL 和方法匹配到相应的路由。
  • Flask 创建一个 Request 对象,封装请求的信息。
  • Request 对象经过处理流程,传递给路由处理函数进行处理。
  • 路由处理函数根据业务逻辑生成响应数据。
  • 响应数据被封装成 Response 对象。
  • Response 对象经过处理和修改,最终发送给客户端。

以下是使用一段简单的代码示例来跟踪 Flask 的源码并分析请求和响应的工作原理:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello, World!'
if __name__ == '__main__':
    with app.test_request_context('/', method='GET'):
        # 获取当前请求上下文
        request = app.preprocess_request()
        # 处理请求,执行路由匹配
        response = app.full_dispatch_request()
        # 处理响应
        response = app.make_response(response)
        response = app.process_response(response)
        # 打印响应内容
        print(response.get_data(as_text=True))

在这个示例中,我们创建了一个最简单的 Flask 应用,并定义了一个根路径的路由处理函数 index。然后,我们使用 test_request_context 创建一个虚拟的请求上下文,并手动模拟了一个 GET 请求。

在模拟请求过程中,我们按照 Flask 的源码调用了几个关键的方法:

  • app.preprocess_request():该方法在请求处理之前被调用,用于预处理请求,包括设置 request 对象和执行请求钩子函
  • app.full_dispatch_request():该方法执行完整的请求分发过程,包括路由匹配、调用路由处理函数以及异常处理等
  • app.make_response(response):该方法将路由处理函数返回的数据封装成一个 Response 对象。
  • app.process_response(response):该方法在响应发送之前对响应进行处理,包括执行响应钩子函数等。

最后,我们通过 response.get_data(as_text=True) 获取响应的内容,并打印在控制台上。

案例

from flask import Flask, request, render_template, jsonify, redirect, make_response
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello, World!'
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # 处理登录逻辑
        if username == 'admin' and password == '123456':
            response = make_response(redirect('/dashboard'))
            response.set_cookie('username', username)
            return response
        else:
            return 'Invalid username or password'
@app.route('/dashboard')
def dashboard():
    username = request.cookies.get('username')
    if username:
        return f'Welcome, {username}!'
    else:
        return redirect('/login')
@app.route('/api/data')
def api_data():
    data = {'name': 'John', 'age': 30}
    return jsonify(data)
@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404
@app.before_request
def before_request():
    # 在请求处理之前执行的操作
    pass
@app.after_request
def after_request(response):
    # 在请求处理之后执行的操作
    return response
if __name__ == '__main__':
    app.run()
相关文章
|
4天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
6天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1558 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
10天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
686 26
|
6天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
219 3
|
1天前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
103 59
|
13天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
703 5
|
2天前
|
Java 开发者
【编程进阶知识】《Java 文件复制魔法:FileReader/FileWriter 的奇妙之旅》
本文深入探讨了如何使用 Java 中的 FileReader 和 FileWriter 进行文件复制操作,包括按字符和字符数组复制。通过详细讲解、代码示例和流程图,帮助读者掌握这一重要技能,提升 Java 编程能力。适合初学者和进阶开发者阅读。
101 61
|
13天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
3天前
vue3+Ts 二次封装ElementUI form表单
【10月更文挑战第8天】
110 57