一、框架对比

  • Django —— 教科书式框架

    • 优势:组件全,功能全,教科书

    • 劣势:占用资源,创建复杂度高

  • Flask —— 以简单为基准开发,一切从简,能省则省

    • 优势:轻,块

    • 劣势:先天不足,第三方组件稳定性较差

Django Flask
Admin —— Model 原生无
Model 原生无
Form 原生无
Session 有 —— 颠覆认知操作

二、Flask入门

  • 下载安装

    • 下载:pip install Flask

    • 注意:不要使用工具中的插件创建 Flask 项目

  • 三行代码启动Flask项目

    from flask import Flask
    app = Flask(__name__)
    app.run()

三、Flask的请求和响应

3.1 Flask中的响应Response

  • 与django对比

    Django Flask 返回
    HttpResponse("hello") "hello" 字符串
    render(request,"html",{"k":v}) render_template("html",k=v) html页面
    redirect("/") redirect("/") 重定向
    JsonResponse({"k":v}) jsonify({"k":v}) 标准的json字符串
    • 以上是web框架的Response三剑客

  • 返回字符串 —— string

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def home():
        return "hello World I am Flask"
    app.run()
  • 返回html页面 —— string

    from flask import Flask, render_template
    app = Flask(__name__)
    @app.route("/index")
    def index():
        return render_template("index.html")
    app.run()
  • 返回重定向 —— string

    from flask import Flask, redirect
    app = Flask(__name__)
    @app.route("/login")
    def login():
        return redirect("/index")
    app.run()
  • 返回文件内容 —— Response instance

    • send_file():读取并返回文件内容,自动识别文件类型,Content-type中添加类型,即,Content-type:文本类型

    • 浏览器特性:

      • 可识别的Content-type,会自动渲染

      • 不可识别的Content-type,会自动下载

    from flask import Flask, send_file
    app = Flask(__name__)
    @app.route("/get_file")
    def get_file():
        # 返回文件内容,自动识别文件类型,Content-type中添加文件类型,Content-type:文件类型
        return send_file("2.exe")
    app.run()
  • 返回标准格式的json字符串 —— string

    • jsonify():返回标准格式的json字符串,本质:先序列化json的字典,Content-type中加入Application/json,Flask1.1.1 直接返回字典格式,相当于自动执行jsonify

    from flask import Flask, send_file
    app = Flask(__name__)
    @app.route("/get_json")
    def get_json():
        d = {"k":"v"}
        # 返回标准Json格式字符串 API接口
        return jsonify(d)
    app.run()

3.2 Flask中的请求Request

  • 与django对比

    Django Flask Flask中的含义
    request.method request.method 获取请求方式
    request.GET request.args 获取URL中的数据
    request.POST request.form 获取FormData中的数据 ,也就是所谓的Form标签
    request.FILES request.files 获取request中的文件,返回FileStorage中,存在save(保存文件)和filename(原始文件名)
      request.json 请求中Content-Type:application/json,请求体中的数据被序列化到 request.json中,以字典的形式存放
      request.data 请求中Content-Type中不包含Form或FormData,保留请求体中的原始数据,bytes类型
    request.path_info request.path 请求路径 路由地址
    request.get_full_patch() request.url 访问请求的完整路径包括 url参数
    request.get_host() request.host 主机位 127.0.0.1:5000
    request.COOKTES request.cookies 字典获取浏览器请求时带上的Cookie
    • 注意:request.values,获取url和FormData中的数据,敏感地带(url和FormData中存在相同的key时会出错)

import os
from flask import Flask, request, render_template
# request 请求上下文管理
app = Flask(__name__)
​
@app.route("/login",methods=["GET","POST"])
def login():
    # print(request.args.to_dict())
    # print(request.host)
    # print(request.path)
    # print(request.url)
    # print(request.cookies)
    # 优先判断 请求方式
    # 如果是 GET 请求 返回登录页面
    if request.method == "GET":
        return render_template("login.html")
    # 如果是 POST 请求 获取用户名密码 校验
    else: # 405 请求方式不被允许
        my_file = request.files.get("my_file")
        filename = my_file.filename # 获取原始文件名
        file_path = os.path.join("avatar",filename)
        my_file.save(file_path)
        print(request.form.to_dict()) # form - FormData
        if request.form.get("username") == "YWB":
            return "Login OK!"
    return "Login 不OK!"if __name__ == '__main__':
    app.run()
示例

相关文章: