跟ChatGPT学Flask网络编程(4) – GET和POST方法

这篇文章我们来看一下Flask如何处理HTTP最常见的两种方法GET和POST。

:给我解释一下flask 中http的GET和POST方法

ChatGPT: 在 Flask 中,HTTP 请求可以使用不同的方法来发送,其中最常见的两种方法是 GET 和 POST。GET 方法是用于从服务器获取数据的 HTTP 请求方法。当我们在浏览器地址栏中输入一个 URL 并按下回车键时,实际上是向服务器发送了一个 GET 请求,请求服务器返回指定 URL 路径上的资源或数据。在 Flask 应用中,我们可以使用 @app.route() 装饰器来定义处理 GET 请求的路由函数,如下所示:

from flask import Flask, request

app = Flask(__name__)

@app.route('/hello')
def hello():
    name = request.args.get('name', 'World')
    return f'Hello, {name}!'


在这个例子中,我们定义了一个 URL 路径为 /hello 的路由函数 hello,它可以接收一个名为 name 的查询参数,并将其显示在返回的响应中。当我们在浏览器中访问 URL http://localhost:5000/hello?name=Flask 时,实际上是向服务器发送了一个 GET 请求,请求服务器返回 /hello 路径上的数据,并将查询参数 name=Flask 传递给路由函数 hello 进行处理。POST 方法则是用于向服务器提交数据的 HTTP 请求方法。当我们在表单中填写数据并点击提交按钮时,实际上是向服务器发送了一个 POST 请求,将表单中的数据提交给服务器进行处理。在 Flask 应用中,我们可以使用 @app.route() 装饰器来定义处理 POST 请求的路由函数,如下所示:

from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # 验证用户名和密码
        if username == 'admin' and password == '123456':
            return 'Login success!'
        else:
            return 'Invalid username or password'
    else:
        return '''
            <form method="post">
                <input type="text" name="username" placeholder="Username"><br>
                <input type="password" name="password" placeholder="Password"><br>
                <button type="submit">Login</button>
            </form>
        '''

在这个例子中,我们定义了一个 URL 路径为 /login 的路由函数 login,它可以处理 GET 和 POST 请求。当请求方法为 GET 时,该函数会返回一个包含登录表单的 HTML 页面;当请求方法为 POST 时,该函数会从表单中获取用户名和密码,进行验证,并返回相应的响应。在处理 POST 请求时,我们可以使用 request.form 属性来获取表单数据,其中 request.form.get('username')request.form.get('password') 分别对应表单中的用户名和密码输入框。

网页运行结果,注意要在程序最后一行添加以下代码:

if __name__ == '__main__':
    app.run()
图片

登录页面GET方法获取的表单:

图片

POST方法提交表单,输入正确的用户名和密码:

图片

错误的用户名和密码结果:

图片

让我们将GET 方法的表单替换为login.html网页

我:将login()函数替换为return render_template(‘login.html’)并更新相应的login.html

ChatGPT:如果想将 login() 函数替换为 return render_template(‘login.html’),我们需要创建一个名为 login.html 的模板文件,并在其中编写登录表单的 HTML 代码。可以在 Flask 应用的 templates 文件夹下创建一个名为 login.html 的文件,其内容如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <h1>Login Page</h1>
    <form method="post">
        <input type="text" name="username" placeholder="Username"><br>
        <input type="password" name="password" placeholder="Password"><br>
        <button type="submit">Login</button>
    </form>
</body>
</html>

然后,在 Flask 应用中将 login() 函数替换为 return render_template(‘login.html’),如下所示:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        # 验证用户名和密码
        if username == 'admin' and password == '123456':
            return 'Login success!'
        else:
            return 'Invalid username or password'
    else:
        return render_template('login.html')

在这个例子中,当请求方法为 GET 时,login() 函数会返回渲染后的 login.html 页面,而当请求方法为 POST 时,login() 函数会从表单中获取用户名和密码,进行验证,并返回相应的响应。使用 render_template 函数可以将 Flask 应用中指定的模板文件渲染成 HTML 页面,从而在浏览器中显示。

:解释一下@app.route中的methonds = [‘GET’,”POST’]

ChatGPT:@app.route 装饰器的 methods 参数用于指定这个视图函数可以处理的 HTTP 请求方法。HTTP 协议定义了很多不同的请求方法,其中最常见的两种是 GET 和 POST。GET 用于从服务器获取资源,而 POST 用于向服务器提交数据。在 Flask 应用中,默认情况下,视图函数只能处理 GET 请求。如果想要让视图函数也能处理 POST 请求,需要在 @app.route 装饰器中指定 methods 参数,并将其值设置为包含 ‘GET’ 和 ‘POST’ 的列表。例如:

@app.route('/login', methods=['GET', 'POST'])
def login():
    # 处理 GET 和 POST 请求
    pass

上面的代码指定了 /login 路由可以处理 GET 和 POST 请求,这样,当客户端向 /login 发送 POST 请求时,Flask 就会调用 login() 函数来处理这个请求。

注:在 Flask 中,视图函数(View Function)是用来处理 HTTP 请求并生成 HTTP 响应的 Python 函数。视图函数通常与应用的不同 URL 相关联,当 Flask 应用收到来自客户端的 HTTP 请求时,Flask 会通过路由系统匹配请求的 URL 和相应的视图函数,并将请求转发给匹配的视图函数来处理。

小结一下:

1、GET和POST常见的两种http请求方法,GET 用于从服务器获取资源,而 POST 用于向服务器提交数据。

2、Flask的视图函数默认只能处理GET请求,可以在@app.route中指定methods参数,使其包含’GET’和’POST’的列表。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注