Flask框架【四】—Flask请求和响应对象

一、Flask请求对象request

在django中,请求对象request被封装在django中,我们在视图函数无时不再传递使用,而在Flask中,request已经是一个全局的变量了,需要我们导入才能使用。

1.request的属性

  • request.method:获取请求的方法,POST

  • request.args: 获取URL的查询参数,返回ImmutableMultiDict

  • request.args.to_dict():查询参数转化为dict,{'id': '1'}

  • request.form:获取FormDage中的文件数据,ImmutableMultiDict

  • request.values:获取Form和Args中的数据,CombinedMultiDict

  • request.path:路由地址,如/login

  • request.full_path:获取URL的全路径

  • request.url:获取访问的全路径

  • request.base_url:获取URL路径,不带参数的部分

  • request.cookies:获取cookies中的数据

  • request.headers:获取请求头中的数据

使用实例

from flask import Flask
from flask import request
​
app = Flask(__name__)
​
@app.route('/login.html', methods=['GET', "POST"])
def login():
    # 请求相关信息
    request.method  # 获取请求的方法,POST
    request.args  # 获取URL的查询参数,
ImmutableMultiDict([('id', '1')])
    request.args.to_dict()  # 查询参数转化为dict,{'id': '1'}
    request.form  # 获取FormDage中的文件数据,ImmutableMultiDict([('username', '123'), ('password', '123')])
    request.values  # 获取Form和Args中的数据,CombinedMultiDict([ImmutableMultiDict([('id', '1')]), ImmutableMultiDict([('username', '123'), ('password', '123')])])
    
    request.path  # 路由地址,如/login
    request.full_path  # 获取URL的全路径
    request.url  # 获取访问的全路径
    request.base_url  # 获取URL路径,不带参数的部分
    
    request.cookies  # 获取cookies中的数据
    request.headers  # 获取请求头中的数据
       
    request.url_root  
    request.host_url
    request.script_root
    request.host
    
    request.files  # 获取Form提交的文件数据
    obj = request.files['the_file_name']
    obj.save('/var/www/uploads/' + secure_filename(f.filename))
    
    request.json  # 请求头为Content-type:application/json的数据序列化后存在request.json中
    request.data  # 请求头Content-type,不包含 Form or data的数据存在这里
    
    return "content"if __name__=="__main__":
    app.run()

2.form文件上传

视图函数写法

from flask import Flask, render_template, request

app = Flask(__name__)
app.secret_key = "asdfnlasdlfnl"
app.debug = True

@app.route("/login",methods=["GET","POST"])
def upload():
    if request.method == "POST":
    file = request.files.get("my_file")  # 获取上传文件的键
    file.save(file.filename)  # 保存文件,根据上传的文件名
    return "上传成功"

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

前端页面

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="my_file">
    <input type="submit" value="上传">
</form>

二、Flask响应对象Response

1.响应方法

1.响应字符串

对比django中,我们返回字符串的方式是通过HttpResponse来返回,Flask中直接return一个字符串即可。

@app.route("/")
def home():
    return "Hello World!"

2.返回模板文件

from flask import render_template
@app.route("/")
def home():
    return render_template('html模板路径',**{})

3.重定向

from flask import redirect
@app.route("/")
def home():
    return redirect('/index.html')

4.其他响应方法

response = make_response(render_template('index.html'))
response是flask.wrappers.Response类型
​
response.delete_cookie('key')  # 删除cookie某个键
response.set_cookie('key', 'value')  # 设置cookie的键
response.headers['X-Something'] = 'A value'  # 设置响应头信息
return response

2.两个特殊封装

1.jsonify

通过jsonify返回,会在响应头中添加Content-type:application/json

在Flask 1.1.1 版本中 加入了 直接返回字典 可以不再使用jsonify了

@app.route("/json")
def my_jsonify():
    return jsonify({"a":1})
    # return {"k":"v"}  # 1.1.1版本后可以直接返回字典

2.send_file

发送文件,会自动打开文件并发送文件中的内容,而且能够识别文件类型,在响应头中自动添加Content-type:文件类型。

注意:当浏览器无法识别Content-type时,会下载该文件

@app.route("/my_file")
def my_file():
    return send_file("1.jpg")  # 识别为图片,相对路径
    # return send_file("1.zip")  # 不能识别,自动下载

 

posted @ 2019-07-11 16:28  ryxiong728  阅读(954)  评论(0编辑  收藏  举报