1.启动Flask
   from flask import Flask
   app = Flask(__name__)
if __name__ == '__main__':
   app.run("0.0.0.0",9527) # 监听 绑定 ?
2.Flask 的 Response
   1.HTTPResponse 返回字符串  "" 
   2.render_template 渲染返回模板文件 
   3.redirect 重定向
   # Flask 特殊封装
   4.send_file 打开返回文件内容 Content-Type:文件类型 自动识别的文件类型
   5.jsonify 返回标准的JSON格式字符串 Content-Type:application/json
3.Flask 的 Request
    # 有关的属性:
   1.Request 导入 - 请求上下文 
   2.Request.method 请求方式 HTTP 8 种 POST(增)DELETE(删) PUT(改) GET(查) OPTIONS请求跨域
   3.Request.path url_root 路由地址
   4.Request.host 获取访问主机地址
   # 有关的方法:
   request.form   FormData中的数据 to_dict() 直接返回字典数据
   request.args   URL中的数据
   request.data   请求体的原始信息 只有在 Content-Type 没有 Form b""
   request.json   请求头中的 Content-Type:application/json 字典
   request.headers    请求头中的信息
   request.cookies    请求中Cookie的信息
   # 有关的坑:
   request.values 不可触及的地带
4.Flask 中的 Session
   from flask import session
   使用session的前提是在 application 中加入 secret_key
   app.secret_key = "$%^&*($#$%^&*^YH&U"
   def get_session():
      session["user"] = 123
   交由客户端保管机制
   1.开启Session - session["user"] = 123
   2.session 序列化字符串
   3.通过 secret_key 进行加密
   4.通过 Cookie 返回客户端
   接收Session
   1.通过 Cookie 获取 session
   2.通过 secret_key 解密
   3.反序列化 字典
   4.session
   增加装饰器 实现验证登录
   1.Flask 中路由
      *1.endpoint 不能重复 对应视图函数 默认是视图函数名 
      视图函数与路由对应关系 url_for 反向创建url
      *2.methods 允许请求的方式 ["GET","POST","DELETE","PUT"]
      3.redirect_to 永久重定向 没有进入视图直接跳转 redirect_to="/new_look"
      4.strict_slashes=False 是否严格要求 路由匹配规则最后的杠"/last/"
      5.defaults={"nid":"22"} 默认参数 def 视图函数中(nid)一定要接受参数
        # @app.route("/look", endpoint="look", methods=["GET", "POST", "post", "get"], strict_slashes=False, defaults={"nid":1})
        # @app.route("/look", defaults={"nid": 1})
        # @app.route("/look/<int:page>")
        @app.route("/look/<string:page>")
        def look(page):
            return f"当前是第{page}页"
      **动态参数路由 /look/<int:page>_<int:row>_<int:row_2>
      应用场景 利用Send_file限定返回文件
        from flask import send_file
        @app.route("/look/<folder>/<filename>")
        def look(folder, filename):
            file_path = os.path.join(folder, filename)
            return send_file(file_path)
   2.Flask 初始化实例化参数
      *static_folder        静态文件存放路径
      *static_url_path   静态文件访问路径 默认值为 "/{static_folder}"
      *template_folder   模板存放路径
      static_host 静态文件访问服务HOST -> 指向到另外一台服务器
    版一:
    import os
    from flask import Flask
    from flask import render_template
    from flask import send_file
    # template_folder指定模板路径,static_folder静态默认访问路径,static_url_path默认访问的url路径
    app = Flask(__name__, template_folder="templatesdfdsfdf", static_folder="image", static_url_path="/static")
    # 重定义默认访问路径
    my_static_folder = "image"
    my_static_url_path = None
    if not my_static_url_path:
        # 不为空
        url_path = f"/{my_static_folder}"
    @app.route("/")
    def index():
        return render_template("index.html")
    @app.route(f"{url_path}/<filename>")
    def look(filename):
        file_path = os.path.join(my_static_folder, filename)
        return send_file(file_path)
    if __name__ == '__main__':
        app.run()
   3.Flask 对象配置 简单
   app.default_config 默认配置
   DEBUG 模式 开启编辑时代码重启 Log打印级别最低 错误信息透传
   TESTING 模式 无限接近生产环境 代码编辑不会重启 Log级别较高 错误信息不再透传
   SESSION_COOKIE_NAME 存放在浏览器cookie中session的名称
   app.config["SESSION_COOKIE_NAME"] = "I am Not Session" 第一个字符,绝对不能是 空格 
   Flask Config 快速配置
   class DebugConfig:
        DEBUG = True
        SECRET_KEY = "%^&*(%^&*"
        PERMANENT_SESSION_LIFETIME = 3600
        SESSION_COOKIE_NAME = "I am Not Session"
        OLD = "OLD"
        BOY = "BOY"
        EDU = "EDU"
        PYTHON = "PYTHON"
        FLASK = "FLASK"
    class TestConfig:
        TESTING = True
        SECRET_KEY = "我是一个加密的字符串牛逼吧"
        PERMANENT_SESSION_LIFETIME = 30
        SESSION_COOKIE_NAME = "TestConfig"
        OLD = "OLDS"
        BOY = "BOYS"
        EDU = "EDUS"
        PYTHON = "PYTHONS"
        FLASK = "FLASKS"
    访问:
    import os
    from flask import Flask
    from flask import render_template
    from flask import send_file
    from flask import session
    app = Flask(__name__)
    # 增加配置文件:
    from setting import DebugConfig, TestConfig
    # app.config.from_object(DebugConfig)
    app.config.from_object(TestConfig)
    # 重定义默认访问路径:
    my_static_folder = "image"
    my_static_url_path = "/look"
    if not my_static_url_path:
        # 不为空:
        my_static_url_path = f"/{my_static_folder}"
    @app.route("/")
    def index():
        session["user"] = "123123"
        return render_template("index.html")
    @app.route(f"{my_static_url_path}/<filename>")
    def look(filename):
        file_path = os.path.join(my_static_folder, filename)
        return send_file(file_path)
    if __name__ == '__main__':
        app.run()
   4.Flask 中的 蓝图 Blueprint
   Django app01
   蓝图作用 功能隔离 路由隔离
   from flask import Blueprint
   # Blueprint 当做一个不能够run的Flask 实例
   user = Blueprint(name="app02user",__name__,url_prefix="/shopping") # url_prefix
   @user.route("/login")
   def login():
      return "I am app02 userBP login func"  
   在Flask实例中增加注册蓝图
   app.regiest_blueprint(蓝图-user)
   name="app02user" 蓝图名称 不能重复 保证在app中是唯一的
   url_prefix="/shopping" URL前缀 用于隔离相同URL