Flask02——request请求及传递接收参数

GET和POST

上一讲,我们已经介绍了flask的最小实例,我们已经可以通过浏览器来请求访问视图函数了,细心的同学应该可以发现我们在浏览器中输入的请求地址前面带的有http://,这也是我们在网上浏览各种网站的时候经常见到的。这就是http协议,它告诉浏览器要通过什么协议去服务器请求数据。当然http协议包含很多内容,我们在此只讨论我们眼前需要了解的一些技术点。
首先提到http协议就不得不说一下请求方式,这里只讨论我们经常用到的两种请求方式:GET和POST。
首先来看一下对这两种请求方式的标准定义:

GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。

上面重点提到了”资源“一字,资源指的是放在服务器上的HTML页面,CSS,JS,图片,当然由于HTML页面一般都是由后台开发语言配合模板,来生成的页面,所以模板里面的数据就需要从数据库提取而来,放到模板中,也就是页面上的内容,再加上样式和图片,从而更加美观的展现出来。
所以我们经常浏览网页的行为一般都是对服务器发起的GET请求。
而我们进行的比如登录,注册要在一个表单里面输入信息,发给web服务器的操作一般会使用POST请求。对于POST这种请求,很明显,我们在表单中发送了数据到服务器。对于登录操作来说的话,就有可能在数据库中记录一下此用户的登录时间。对于注册操作来说,很明显,我们要在数据库当中生成一条新的用户记录。由此可见POST操作一般都会创建或更改已有数据(资源)。

视图函数的请求方式

再来说一下上一讲我们所讲的最小实例。

@app.route('/')
def index():
	return 'Hello World'

对于这种没有配置请求方式的视图函数,默认接收的请求方式为是GET请求。如果此时我们要对此视图函数发起POST请求的话,服务器就会告诉我们”此方式不被允许“,意思就是此视图函数不支持POST方式的请求。那么问题来了,我们怎么知道我们发送了什么方式的请求呢?
这就需要用到我们浏览器的工具了,强烈推荐使用火狐浏览器。在火狐浏览器中输入http://127.0.0.1:5000/地址,请求后,在此页面点击鼠标右键,选择查看元素,可以看到多个选项,选择网络,再次请求,然后点击第一条请求数据。
查看请求地址和请求方式可以看到,请求的服务器地址为:http://127.0.0.1:5000/,请求方式为:GET,状态码为200,表示请求成功。

由地址栏输入地址,直接返回内容的请求,一般都是GET请求。说完了,GET请求,下面就要来说一下POST请求了。

我们要怎样发起POST请求呢?让我们新建一个HTML文件demo1.html。里面输入如下内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>POST请求</title>
</head>
<body>
    <form action="http://127.0.0.1:5000/" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="passwd"> <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

可以看到,我们制作了一个表单,action当中填写的地址,就是我们点击提交后,所请求的地址。
method的值即为请求方式。
接下来,通过火狐浏览器打开此HTML文件。
右键点击查看元素,在两个输入框输入内容,用户名中我输入:xiaoming,密码中输入:111111,然后点击提交。
在这里插入图片描述
点击网络,然后点击第一条请求数据。
在这里插入图片描述可以看到浏览器返回内容,告诉我们此方式不被允许,通过查看元素中内容,我们也可以看到,请求方式为POST,返回的状态码为405,405状态码就代表了请求方式不会允许。也就是此视图函数是不允许POST请求的。那么我们怎么让此视图函数支持POST请求呢?
就需要在视图函数中的路由规则上配置POST请求方式了。

@app.route('/', methods=['GET', 'POST'])
def index():
    return 'Hello World!'

再次提交,可以看到不再出现刚才的请求被允许的提示了,而是正常返回了Hello World!。这次的消息头显示如下结果,代表发起POST成功。
在这里插入图片描述
点击响应,可以看到就是显示在浏览器当中的Hello World!
在这里插入图片描述
也就是我们发起请求后的响应。

注意:当我们没有给视图函数配置methods参数的时候,默认此视图函数支持GET请求,如果要配置methods参数,就不能把GET方式给省略掉,即为:methods=['GET', 'POST']如果省略掉的话,视图函数就不允许GET方式请求了。

请求对象request的使用

我们上面提到的请求地址,请求方式,请求参数等这些内容,都被Flask框架放到了请求对象request当中。接下来我们首先引入request包。

from flask import Flask, request

然后我们再来创建一个新的视图函数demo1

@app.route('/demo1', methods=['GET', 'POST'])
def demo1():
    print(request.url)
    print(request.method)
    return 'OK'

以上代码分别打印了request请求对象中保存的url和method。在地址栏输入:http://127.0.0.1:5000/demo1 发起对此视图函数的请求。这次我们要到pycharm的控制台当中来看打印的信息了。我们可以看到如下结果。

http://127.0.0.1:5000/demo1
GET

request.url就是请求的地址,request.method就是发起此次请求的请求方式。
那么我们怎么在同一个视图函数当中根据不同的请求方式来分别进行相应的操作呢?请看如下代码。

@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
    if request.method == 'POST':
        return 'POST请求方式!'
    return 'GET请求方式!'

对于GET请求方式,我们就直接在地址栏输入http://127.0.0.1:5000/demo2 即可。可以看到走视图函数的下面分支,返回内容为:GET请求方式!
那么如何让此视图函数走上面分支呢?就需要修改刚才的demo1.html文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>POST请求</title>
</head>
<body>
    <form action="http://127.0.0.1:5000/demo2" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="passwd"> <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

再次用浏览器打开此文件,再次输入测试数据,点击提交。可以看到正常返回了上面分支内的内容POST请求方式!。这次我们可以看一下参数选项中是什么。
在这里插入图片描述
可以看到,就是我们刚才在输入框输入的内容。也就是我们提交的用户名和密码所对应的数据。那么输入框中的内容怎么获取到呢,又该我们的request请求对象出场了,依然是保存在request当中。修改以上代码将两个请求方法拼接返回。

@app.route('/demo2', methods=['GET', 'POST'])
def demo2():
    if request.method == 'POST':
        return '用户名:' + request.form.get('username') + '密码:' + request.form.get('passwd')
    return 'GET请求方式!'

再次由浏览器打开的demo2.html文件的输入框中输入测试数据,点击提交。返回如下结果。
在这里插入图片描述
由此看到,我们的请求参数的获取方式为:request.form.get(‘username’) 和 request.form.get(‘passwd’),username和passwd就是表单中字段的name值。
上面所说的是通过POST请求方式传递参数,那么我们能不能通过GET方式来传递参数呢?答案时肯定的。我们可以通过在地址后面加?的方式传递参数。?后面通过key=value的键值对传递参数,如果有多个参数需要用&来链接。
我们首先来传递单个参数建为id值为1。请求地址即为:http://127.0.0.1:5000/demo3?id=1 那么我们就可以通过如下代码来获取请求地址里面传递过来的参数id。

@app.route('/demo3')
def demo3():
    return 'ID:' + request.args.get('id')

请求之后将返回如下内容:
在这里插入图片描述
表示我们正常通过request.args.get('id')获取到了地址栏传递过来的参数。
如果时多个参数的话,假如请求地址为:http://127.0.0.1:5000/demo3?username=xiaoming&passwd=111111 用&拼接多个请求参数。代码就要修改如下:

@app.route('/demo3')
def demo3():
    # return 'ID:' + request.args.get('id')
    return '用户名:' + request.args.get('username') + '密码:' + request.args.get('passwd')

请求上面地址后,正常打印如下内容:
在这里插入图片描述
至此,我们关于request请求及传递接收参数的主要内容讲解完成。

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值