flask框架中request请求用法详解
  TEZNKK3IfmPf 2023年11月12日 15 0

        当浏览器去访问一个地址时,Http协议会向后台传递一个request对象。这个request对象包含请求头、请求参数、以及请求方式,当然后台可以取到request。然后进行逻辑处理。

        在flask框架中,request对象是一个全局的,在任何地方都可以使用。

        request中包含了前端发送过来的所有数据 ,请求的 request 对象中保存了一次HTTP请求的一切信息。  

        通过request.from可以直接发送提取请求体中的表单格式数据,是一个类字典的对象 。  

        通过get方法只能拿到多个重名参数的第一个。

flask框架中request请求用法详解

reques常用的属性:

  • 如果是json格式的请求数据,则是采用request.data来获取请求体的字符串。
  • 如果是form表单的请求体,那么则可以使用request.form来获取参数。
  • 如果是url参数,例如:url?param1=xx&param2=xx,那么则可以使用request.args来获取参数。
  • 如果需要区分GET/POST请求方法,则可以使用request.method来进行判断区分。
  • 如果需要接收上传的文件,则可以使用request.files来获取上传的文件信息。

1、GET请求

        写个人信息的接口,也就是视图函数。新建一个名为personal_info.html的模板,在模板里写如下表单:

  • action:表示要提交到的地址
  • method:请求方式

personal_info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/center/add" method="get">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    特长:篮球<input type="checkbox" name="hobby" value="篮球">
    足球<input type="checkbox" name="hobby" value="足球">
    排球<input type="checkbox" name="hobby" value="排球">
    羽毛球<input type="checkbox" name="hobby" value="羽毛球"><br>

    <input type="submit" value="提交">

</form>
</body>
</html>

        后台这个时候需要写两个视图,一个视图用于显示注册页面,一个视图用于处理前端传过来的参数:

from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('personal_info.html')


@app.route('/center/add')
def center():
    if request.method == 'GET':  # 请求方式是get
        name = request.args.get('name')  # args取get方式参数
        age = request.args.get('age')
        hobby = request.args.getlist('hobby')  # getlist取一键多值类型的参数
        return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

运行结果: 

flask框架中request请求用法详解

flask框架中request请求用法详解

 2、POST请求

        登录和注册都要使用Post请求,一些敏感信息不能在浏览器的地址上显示。把刚才的个人信息例子改成Post请求,前端只需要把表单里面的method改下就行:

method="post"

后端需要改两个地方:

  • 请求方法:默认是get请求
  • 参数提前:把args改成form
from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('personal_info.html')


@app.route('/center/add', methods=['GET', 'POST'])  # 支持get和post方法
def center():
    if request.method == 'GET':  # 请求方式是get
        name = request.args.get('name')  # args取get方式参数
        age = request.args.get('age')
        hobby = request.args.getlist('hobby')  # getlist取一键多值类型的参数
        return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)
    elif request.method == 'POST':
        name = request.form.get('name')  # form取post方式参数
        age = request.form.get('age')
        hobby = request.form.getlist('hobby')  # getlist取一键多值类型的参数
        return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

运行结果:

flask框架中request请求用法详解

flask框架中request请求用法详解

3、GET和POST为同一URL

personal_info.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/personal_info" method="post">
    姓名:<input type="text" name="name"><br>
    年龄:<input type="text" name="age"><br>
    特长:篮球<input type="checkbox" name="hobby" value="篮球">
    足球<input type="checkbox" name="hobby" value="足球">
    排球<input type="checkbox" name="hobby" value="排球">
    羽毛球<input type="checkbox" name="hobby" value="羽毛球"><br>

    <input type="submit" value="提交">

</form>
</body>
</html>

main.py

from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/personal_info', methods=['GET', 'POST'])  # 支持get和post方法
def center():
    if request.method == 'GET':  # 请求方式是get
        return render_template('personal_info.html')
    elif request.method == 'POST':
        name = request.form.get('name')  # form取post方式参数
        age = request.form.get('age')
        hobby = request.form.getlist('hobby')  # getlist取一键多值类型的参数
        return "姓名:%s 年龄:%s 特长:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

运行结果:

flask框架中request请求用法详解

flask框架中request请求用法详解

4、上传文件

        上传文件也是常用的功能,前端上传一张文件,然后后端处理保存到服务器上。文件这种类型属于多媒体类型资源。前端form表单里面需要加enctype="multipart/form-data"

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>
</body>
</html>

upload.py

from flask import Flask, request, render_template, redirect, url_for
from werkzeug.utils import secure_filename
import os
from flask import send_from_directory

app = Flask(__name__)

UPLOAD_FOLDER = 'media'  # 注意:要提前在根目录下新建media文件,否则会报错
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
    return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route("/upload", methods=['GET', 'POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        if "file" not in request.files:
            return redirect(request.url)

        file = request.files.get('file')  # 获取文件

        if file.filename == '':
            return redirect(request.url)

        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)  # 用这个函数确定文件名称是否是安全 (注意:中文不能识别)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件
            return redirect(url_for('show', filename=filename))


# 展示图片
@app.route('/show/<filename>')
def show(filename):
    # send_from_directory可以从目录加载文件
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

运行结果:

flask框架中request请求用法详解

flask框架中request请求用法详解

 flask框架中request请求用法详解

5、获取客户端IP

        可以使用request.remote_add获取客户端IP。

        remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

示例代码:

from flask import Flask, request

app = Flask(__name__)


@app.route('/')
def index():
    addr = request.remote_addr
    print(addr)
    return "Hello World! My IP is :" + addr


if __name__ == '__main__':
    app.run('0.0.0.0')

运行结果:

flask框架中request请求用法详解

6、flask中request.args和request.form区别

  • 当get请求时,需要使用request.args来获取数据
  • 当post请求时,需要使用request.form来获取数据

7、request属性使用 

7.1 Json请求:使用request.data获取请求体

from flask import Flask, request
import json

app = Flask(__name__)


@app.route('/json', methods=['POST'])
def json_request():
    data = json.loads(request.data)  # 将json字符串转为dict
    name = data['name']
    age = data['age']
    return F"name is {name}, age is {age}"


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

flask框架中request请求用法详解

7.2 form表单请求:request.form 获取请求参数

from flask import Flask, request

app = Flask(__name__)


@app.route('/form', methods=['POST'])
def form_request():
    name = request.form.get('name')
    age = request.form.get('age')
    return F"name is {name}, age is {age}"


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

flask框架中request请求用法详解

7.3 form 表单请求中存在同一个参数名多个值的情况

from flask import Flask, request

app = Flask(__name__)


@app.route('/form', methods=['POST'])
def form_request():
    name = request.form.get('name')
    age = request.form.get('age')
    name_list = request.form.getlist('name')
    return F"name is {name}, age is {age}, name_list is {name_list}"


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

flask框架中request请求用法详解

7.4 URL请求参数: request.args

from flask import Flask, request

app = Flask(__name__)


@app.route('/args', methods=['GET', 'POST'])
def args_request():
    name = request.args.get('name')
    age = request.args.get('age')
    name_list = request.args.getlist('name')
    return F"name is {name}, age is {age}, name_list is {name_list}"


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

flask框架中request请求用法详解

flask框架中request请求用法详解

7.5 上传文件请求:request.files

from flask import Flask, request

app = Flask(__name__)


@app.route('/upload_file', methods=['POST'])
def file_request():
    file = request.files.get('file')
    if file is None:
        return "未上传文件!"
    file.save(f"{file.name}.jpg")
    return f"{file}文件上传成功!"


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

flask框架中request请求用法详解

flask框架中request请求用法详解

7.6 request.args.to_dict()用法

from flask import Flask, request

app = Flask(__name__)


@app.route('/args', methods=['GET', 'POST'])
def args_request():
    data = request.args.to_dict()
    return data


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

flask框架中request请求用法详解

7.7 request.get_json()用法

from flask import Flask, request

app = Flask(__name__)


@app.route('/args', methods=['GET', 'POST'])
def args_request():
    data = request.get_json()
    return data


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

flask框架中request请求用法详解

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   32   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
  TEZNKK3IfmPf   2024年05月31日   25   0   0 python
TEZNKK3IfmPf