1、request的form_data_args用法
当浏览器去访问一个地址时,Http协议会向后台传递一个request对象。这个request对象包含请求头、请求参数、以及请求方式,当然后台可以取到request。然后进行逻辑处理。
在flask框架中,request对象是一个全局的,在任何地方都可以使用。
request中包含了前端发送过来的所有数据 ,请求的 request 对象中保存了一次HTTP请求的一切信息。
通过request.from可以直接发送提取请求体中的表单格式数据,是一个类字典的对象 。
通过get方法只能拿到多个重名参数的第一个。
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:请求方式
- 模板文件就是html文件,需要放在templates文件夹中。当然也可以Flask(name,template_folder)来修改模板地址,但不推荐通render_template来渲染模板传变量到模板中,可以把变量定义成字典,然后在render_template中,通过关键词参数的方式传递过去,render_template(’ ',**context),**context字典
personal_info.html
form action=“/center/add” method=“get”; action指定表单发送的地址; method指定数据传送到服务器的方式,get会将发送的数据显示在地址栏,post就不会,单论安全而言,post安全性更高;
<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')#对应表单里面的action="/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()
点击提交,页面跳转
字典提取采用get,而不是[“键”]。因为采用get如果对应的键没有值返回空值。如果采用[“键”] 没有值会报错。
2 POST
登录和注册都要使用Post请求,一些敏感信息不能在浏览器的地址上显示。把刚才的个人信息例子改成Post请求,前端只需要把表单里面的method改下就行:
method="post"
后端需要改两个地方:
- 请求方法:默认是get请求
- 参数提前:把args改成form
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
#comtent={"username":"yudengwu"}
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()
注意看网址区别
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>
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def index():
#comtent={"username":"yudengwu"}
return render_template('personal_info.html')
@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()
2、上传文件
在Flask中处理文件上传。 它需要一个 enctype 属性设置为 multipart/form-data 的HTML表单,将该文提交到指定URL。 URL处理程序从 request.files[] 对象中提取文件并将其保存到所需的位置。
每个上传的文件首先保存在服务器上的临时位置,然后再保存到最终位置。 目标文件的名称可以是硬编码的,也可以从 request.files [file] 对象的 filename 属性中获取。 但是,建议使用 secure_filename() 函数获取它的安全版本。
可以在Flask对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小。
变量 | 说明 |
---|---|
app.config[‘UPLOAD_FOLDER’] | 定义上传文件夹的路径 |
app.config[‘MAX_CONTENT_PATH’] | 指定要上传的文件的最大大小 - 以字节为单位 |
app.config['UPLOAD_FOLDER'] = 'static/upload/' # 定义上传文件夹的路径是上传到upload/文件夹下,upload文件夹最好放在static文件夹下,放在其他地方,前台渲染不显示
app.config['MAX_CONTENT_PATH'] = 1000000000 # 指定要上传的文件的最大大小(以字节为单位)
以下代码具有URL: /upload 规则,该规则显示 templates 文件夹中的 upload.html 文件,以及调用 uploader() 函数处理上传过程的URL => /upload-file 规则。
第一步:前端
upload.html 有一个文件选择器按钮和一个提交按钮。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<form action="/center/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
第二步:新建一个文件夹“media” 用于存放保存的文件。文件夹和代码属于同一个根目录
第三步:后台代码
from flask import Flask, request, render_template,redirect, url_for
from werkzeug.utils import secure_filename
import os
from flask import send_from_directory # 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 # UPLOAD FOLDER 英文上传文件夹
# 判断上传的文件是否是允许的后缀
def allowed_file(filename):
return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/')
def index():
return render_template('upload.html')
@app.route('/center/upload',methods=['POST'])#对应表单里面的action="/upload"
def center():
if "file" not in request.files: #"file" 对应前端upload.html 中的name
return redirect(request.url)
file = request.files.get('file') # 获取文件
if not allowed_file(file.filename): #如果不是传入的指定格式文件。重定向到当前url
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)) # 保存文件 os.path.join把目录和文件名合成一个路径
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)
选择文件点击上传
文件展示在页面和保存到本地media文件夹