Flask 进阶

Date
Mar 2, 2022
Created
Sep 6, 2023 05:48 AM

Flask web框架

  1. Flask 轻量级框架
  1. 轻 第三方支持比较全 扩容功能较为方便
  1. Django 重量级框架
  1. 重 原生组件 全 好

安装

pip install flask

启动flask

增加路由和视图

flask中的response

HttpResponse -return “httpresponse” 返回字符串
Render - 返回模板页面
Redirect - 跳转 重定向 response localtion: url
Flask 特殊封装
  • send_file("文件路径") - 打开并返回文件内容 自动识别 文件类型 Content-Type :text/plan
    • @app.route("/login") def login():    return send_file('static/1111.jpg')
  • Jsonify({k:v}) -返回标准的json字符串 Content-Type:apllication/json
    • @app.route("/index") def index():    d = {        "name": "alexdsb"   }    return jsonify(d)  # / return d
  • Sanic - sonic 索尼克 蓝刺猬 ====flask web
    • async def login()

Flask 中的request

from flask import request
request中的一些方法 具体
@app.route("/login",methods=["POST","GET"]) def login():    if request.method=="GET":        return render_template("login.html")    else:        # 请求方式        # request.method        # 获取url 中的请求参数?id=1        # print(request.args) #ImmutableMultiDict([('id', '123')])        # print(request.args.to_dict()) # 将获取的值转化成字典{'id': '123'}        # print(request.args.get("id")) #123        # form data 中的数据 post 请求提交数据        print(request.form)        print(request.form.to_dict()) # 得到一个字典        request.json # 请求头中带有json格式        request.data # 请求头中不带formdata 保存在请求头中的流数据        print(request.url) # <http://127.0.0.1:5000/login>        print(request.host) #127.0.0.1:5000        print(request.host_url) #<http://127.0.0.1:5000/>        print(request.path) #127.0.0.1:        print(request.files) # 直接保存文件 ImmutableMultiDict([('myFile', <FileStorage: '21.html' ('text/html')>)])        file = request.files.get("myFile")        filename = file.filename # 获取文件名        file.save(filename) #保存 保存文件名        return "200 ok"

Flask 中的原生 session

Session:
from flask import flask
  • 秘钥:secret_key 用于序列化字符串
app.secret_key="%$^&*(HJKJKLSDLJSDK"
  • 使用session
    • Session["key"] = value
  • Session 存到哪里
    • 交由客户端保管机制

Flask 中的路由

  • methods 允许进入当前视图的请求方式
Methods=["POST","GET","DELET","PUT"…..] 8种
  • endpoint # mapping 对应关系 视图函数 - 路由 必须保证唯一
  • Defaults 默认参数
  • redirect_to 永久重定向 301 or 308
  • strict_slashes 是否严格按照路由匹配规则
  • 动态路由规则
    • @app.route("/home/<int:username>") # 默认类型为string def home(username):    return f"its 200 {username} ok"

Flask 初始化配置

app = Flask(name)
template_folder # 模板存放路径
static_folder # 静态文件存放路径
static_url_path # 静态文件访问路径 ”/开头 /{static_folder}

Flask 对象配置

app.secret_key="%$^&*(HJKJKLSDLJSDK" # 自动重启 传递错误信息 log级别较低 Debug 级别 app.debug=True app.config["debug"] = True app.config["SECRET_KEY"] = "asdjskajdklsajdlskajd" app.config["PERMANENT_SESSION_LIFETIME"] = 30 app.config["SESSION_COOKIE_NAME"] = "cookie的名字" app.config["JSONIFY_MIMETYPE"] = "application/json/sadjk" app.default_config # 非常重要

Flask 蓝图

  • 蓝图 - 不能被run 的flask 对象
  • From flask import Blueprint
  • User_bp = Blueprint("蓝图标识",name)
  • 蓝图功能:
      1. 功能隔离
      1. 路由视图分割
  • Flask 实现web socket 需要实现什么组件?
    • Gevent -websocket-flask-io
    • Werkzukg-websocket flask io
  • Utils 是指 数据库连接池
  • 在app 中需要 register 蓝图
    • app.register_blueprint(user.user_bp)

Flask 中的特殊装饰器

  • @app.before_request # 再请求进入视图函数之前
  • @app.after_request #在请求进入视图函数之后 响应返回客户端
正常情况: before1> before2>before3>after3>after2>after1
异常情况: before2 有返回值 :::: before1> before2>after3>after2>after1
  • @app.errorhandler
@app.errorhandler(HttpErrorCode) # 重定向返回信息 HttpErrorCode[4xx,5xx]

Flask 中的CBV -- rest api 规则

class Login(MethodView):    def get(self):        return render_template('login.html')    def post(self):        if request.form.get("username")=="lzc":            return redirect("/index") app.add_url_rule("/login",view_func=Login.as_view(name="login"))