flask框架中request请求用法详解

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

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

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

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

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

flask框架中request请求用法详解_第1张图片

reques常用的属性:

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

1、GET请求

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

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

personal_info.html




    
    Title


姓名:
年龄:
特长:篮球 足球 排球 羽毛球

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

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请求用法详解_第2张图片

 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请求用法详解_第3张图片

flask框架中request请求用法详解_第4张图片

3、GET和POST为同一URL

personal_info.html:




    
    Title


姓名:
年龄:
特长:篮球 足球 排球 羽毛球

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请求用法详解_第5张图片

flask框架中request请求用法详解_第6张图片

4、上传文件

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

upload.html




    
    Upload


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/')
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请求用法详解_第7张图片

flask框架中request请求用法详解_第8张图片

 

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请求用法详解_第9张图片

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请求用法详解_第10张图片

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请求用法详解_第11张图片

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请求用法详解_第12张图片

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请求用法详解_第13张图片

flask框架中request请求用法详解_第14张图片

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请求用法详解_第15张图片

flask框架中request请求用法详解_第16张图片

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请求用法详解_第17张图片

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请求用法详解_第18张图片

7.8 request.json用法 

示例代码:

from flask import Flask, request

app = Flask(__name__)


@app.route('/process_json', methods=['POST'])
def process_json():
    json_data = request.json
    # 对接收到的JSON数据进行处理
    return json_data


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

运行结果:

flask框架中request请求用法详解_第19张图片

7.9 request.json和request.get_json()用法区别

        在Flask框架中,request.json和request.get_json()都是用于获取请求体中的JSON数据的方法,但它们之间有一些区别。

        request.json是一个属性,用于从请求体中获取JSON数据。它只能在请求方法(如POST、PUT)中使用,并且只能使用一次。如果请求体中不包含JSON数据,则request.json将返回None。

        request.get_json()是一个方法,用于从请求体中获取JSON数据。它可以在任何请求方法中使用,并且可以使用多次。如果请求体中不包含JSON数据,则request.get_json()将返回None。此方法还可以接受一些参数,例如strict和silent,用于指定解析JSON数据时的严格程度和错误处理方式。

        综上所述,request.get_json()是更灵活和通用的方法,而request.json则更简单和直接。如果您确定请求体中包含JSON数据,并且您只需要一次使用它,则可以使用request.json。否则,建议使用request.get_json()。

你可能感兴趣的:(Flask框架,flask,python,后端,request)