📜  发布/重定向/获取 (PRG) 设计模式

📅  最后修改于: 2021-09-10 02:50:43             🧑  作者: Mango

先决条件 – HTTP 协议,使用Python 的GET 和 POST 请求

介绍:

PRG是 Web 开发中使用的众多设计模式之一。用于防止在提交表单后重新加载同一个网页导致表单的重新提交。它消除了内容冗余以加强搜索引擎优化并使网站用户友好。
它被大型、值得信赖的在线商店和其他旨在使用户友好的强大网站使用。

问题:

当我们尝试提交 Web 表单时,会向服务器发送 HTTP POST 请求。服务器处理请求并向客户端发送响应代码为 2XX 的响应。当客户端尝试刷新/重新加载网页时,他/她无意中向服务器发送了另一个 HTTP POST 请求,其中包含与之前相同的数据。这可能会导致不希望的结果,例如重复的网络购买。

浏览器重新加载后弹出警告信息框,如下图:

内部工作:

下面是上述问题的内部工作框图。

解决方案:

为了避免这个问题,许多 Web 开发人员使用POST/REDIRECT/GET模式,而不是直接返回一个网页, POST返回一个重定向到另一个网页或相同的网页,具体取决于需求。

内部工作:

下面是上述解决方案的内部工作框图。

使用 Flask 框架的最小Python和 HTML 代码来演示上述概念。

  • 在项目根目录创建一个名为app.py的文件,在其中写入以下代码。并使用 – 安装烧瓶

    $pip install flask
    
    from flask import Flask, render_template, redirect, request, url_for
      
    # Initiate flask app
    app = Flask(__name__)
      
    # Declare routes and methods
    @app.route('/', methods =['GET', 'POST'])
    def home():
        # If it is POST request the redirect
        if request.method =='POST':
            return redirect(url_for('home'))
      
        return render_template('home.html', title ='Home')
      
    if __name__=='__main__':
        app.run()
    
  • 在项目根目录下创建一个文件夹templates ,在templates目录下创建一个home.html文件,写入如下代码。

    
    
             

             
  • 要在控制台中运行 Web 服务器类型:
    $python app.py
    Output:
    Running on http://127.0.0.1:5000/
    
  • 转到 Web 浏览器并输入localhost:5000并按回车键。

    控制台输出:
    在下图中,当我们使用 localhost:5000 时发出第一个 GET 请求,然后我们将数据 POST 到服务器。现在,在处理完数据后,服务器通过发出 GET 请求重定向我们,因此服务器发出第三个 GET 请求,最后在我们尝试刷新页面时发出第四个 GET 请求。

    注意:尝试在不重定向的情况下使用代码。