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 %}

 

posted @ 2019-07-02 09:41  DF-包子  阅读(160)  评论(0)    收藏  举报