当浏览器去访问一个地址时,Http协议会向后台传递一个request对象。这个request对象包含请求头、请求参数、以及请求方式,当然后台可以取到request。然后进行逻辑处理。
在flask框架中,request对象是一个全局的,在任何地方都可以使用。
request中包含了前端发送过来的所有数据 ,请求的 request 对象中保存了一次HTTP请求的一切信息。
通过request.from可以直接发送提取请求体中的表单格式数据,是一个类字典的对象 。
通过get方法只能拿到多个重名参数的第一个。
reques常用的属性:
写个人信息的接口,也就是视图函数。新建一个名为personal_info.html的模板,在模板里写如下表单:
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)
运行结果:
登录和注册都要使用Post请求,一些敏感信息不能在浏览器的地址上显示。把刚才的个人信息例子改成Post请求,前端只需要把表单里面的method改下就行:
method="post"
后端需要改两个地方:
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)
运行结果:
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)
运行结果:
上传文件也是常用的功能,前端上传一张文件,然后后端处理保存到服务器上。文件这种类型属于多媒体类型资源。前端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)
运行结果:
可以使用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')
运行结果:
示例代码:
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()
示例代码:
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()
示例代码:
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()
示例代码:
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()
示例代码:
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()
示例代码:
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()
示例代码:
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()
示例代码:
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.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()。