Flask初识
简介
Flask框架,主要是小而轻便,非常节省资源,开发的速度很快;但Flask原生的组件较少,只有原生的session组件,一般很少用。而基于Flask的代码逻辑开的发出来的三方组件也很全,如果全部安装会比Django框架大很多,而且一旦Flask更新,三方组件如果支撑不了Flask版本的话,就会挂掉
简单使用
1. 环境安装: pip install flask
2. 一个简单的Flask程序,使用Flask实现Hello,world
from flask import Flask
app = Flask(__name__) # 实例化一个Flask对象
app.config["CONFIG"] = True # 开启Flask服务的自动重启
@app.route("/index")
def index():
return "Hello world"
if __name__ == "__main__":
app.run("0.0.0.0", 9527) # 指定Flask服务启动的IP和端口
Flask的返回值
返回值一:HttpResponse,render_template,redirect,
# 1.HttpResponse
@app.route("/index")
def index():
return "Hello world" # 默认返回的就是HttpResponse,直接返回字符串
# 2.render_template
@app.route("/index")
def index():
return render_template("index.html")
# 正常情况下,index.html会飘黄,可以修改templates文件配置,将template folder改成jinja2
# 3.redirect
@app.route("/re")
def index():
return redirect("/index")
# 发送两次请求,第一次访问re,有一个302显示状态;第二次重定向到index页面
返回值二:jsonify,send_file
# 返回标准的json格式数据,在响应头中会有一个Content-Type:application/json
from flask import jsonify
app = Flask(__name__)
@app.route("/index")
def index():
return jsonify({"": ""})
# send_file(),打开并返回文件,自动识别文件类型,并将文件类型返回给Content-Type
from flask import send_file
app = Flask(__name__)
@app.route("/index")
def index():
return send_file("fileName")
针对不同类型的文件,返回的Content-Type不同
1. 发送一个本地文件, 响应头的Content-Type:text/plain (把文件所有内容显示在白板上,不进行任何的渲染)
2. 发送一张图片,响应头中会有 Content-Length>>总长度(二进制的数据流) Content-Type:image/jpeg
3. 发送一个MP4文件, 响应头中的Conten-Type:video/mp4;此时会发送三个请求:第一次获取document内容信息,第二次获取具体数据,第三次获取剩余的数据
4. 发送一个wma音频文件,响应头中的Content-Type:audio/x-ms-wma(二进制文件);这里的ms是microsoft,如果当前发送的是mp3音频文件,响应头就是Content-Type:audio/mpeg
Flask中的request
每个框架中都有处理请求的机制:request;但每个框架的处理机制都有不同,可以先写一个基于 HTML + Flask 的前后端交互
1. 向后端提交一个post请求;
<body>
Hello World
<form method="post" action="/req">
<input type="text" name="user">
<input type="password" name="pwd">
<input type="submit" value="提交">
</form>
</body>
2. Flask服务开启
from flask import request
app = Flask(__name__)
@app.route("/req", methods=["POST"]) # 指定前端的url接口
def req():
return "OK!!!"
# request.method 获取request的请求方式
# request.form 获取到的是ImmutableMultiDict对象,类似于字典
, 不妨使用字典的方式来操作
# request.form["user"]或者request.form.get("pwd"),是可以获取到前端提交的数据的
3.app.route("/req", methods=[])
methods方法代表req这个url地址只允许POST请求,methods是一个请求方式的列表,在这个列表写请求方式是覆盖操作,并非是添加;
4. request相关
| request.method | 获取前端的请求方式 |
| request.form | 获取前端Form传递的参数 |
| request.args |
获取前端url上携带的参数,此时需要改动route中的methods参数,允许前端发送get请求;前端发送的数据类型是ImmutableMultiDict类型 |
| request.values |
CombinedMultiDict([ImmutableMultiDict([]), ImmutableMultiDict([])]) get请求和post请求的参数都会获取到 ===== 但如果 url 和 form 中的key重名的话,form同名key的value会被url中的value覆盖 |
| request.cookies | 在开启浏览器cookies的情况下,存在浏览器中的字符串也会携带,将cookies中的信息读取出来 |
| request.headers | 获取请求头中的所有信息 |
| request.data | 把无法处理的参数转换为json格式存到data中,打印时会返回请求体中的原始数据b"" |
| request.files | 前端发送过来文件,在Flask服务中可以通过request.files[]获取前端传送的文件,通过 .save() 保存前端传送的文件 |
| request.获取路径 |
request.path 获取当前的 url 路径 request.script_root 获取当前 url 路径的上一级路径 request.url 获取当前 url 的全部路径 request.utl_root 获取当前 url 路径的上一级全部路径 |
| request.json | 如果在请求中写入application/json中使用request.json,返回的就是json解析数据,否则会返回None |
render_template补充
我们可以在后端定义一些数据,传递到前端;而在前端的 jinja2 模板中,可以通过 jinja2模板的相关操作获取后端传递的数据;而在后端,我们可以在render_template中传递多个参数
# jinja2 中的 for {% for dic in msg %} {% endfor %} # jinja2 中的 if {% if msg %} {% elif msg1 %} {% else %} {% endif %}

浙公网安备 33010602011771号