-
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()