V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lisisi
V2EX  ›  问与答

app = Flask(__name__, static_url_path='') 是匹配 "/static" 开头的路由,自动变成"/" 吗?

  •  
  •   lisisi · 2019-03-25 18:49:03 +08:00 · 1643 次点击
    这是一个创建于 1830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    app 设置静态文件路径 static_folder='static',在 static 文件夹中有一个 api.json 文件。

    在设置了 app = Flask(__name__, static_url_path='') 之后,匹配到 /static 开头的请求,就把接收到所有的 "/static/api.json" 请求,就自动变成 "/api.json"了?
    

    Application Object

    class flask.Flask(import_name, static_url_path=None, static_folder='static', static_host=None, host_matching=False, subdomain_matching=False, template_folder='templates', instance_path=None, instance_relative_config=False, root_path=None)
    

    http://flask.pocoo.org/docs/1.0/api/#flask.Flask

    3 条回复    2019-03-25 19:43:34 +08:00
    lisisi
        1
    lisisi  
    OP
       2019-03-25 19:22:00 +08:00 via Android
    这样不是每个路由请求,都要匹配两次吗?
    一次匹配下“/”,看看有没有 api.json,再匹配一次“/static/”,看看有没有 api.json ?
    j0hnj
        2
    j0hnj  
       2019-03-25 19:34:03 +08:00
    不是很明白你在说什么,但你的理解是不对的。
    默认情况下 (static_folder='static', static_url_path=None), Flask 会自动添加一条路由 /static/<path:filename> 到 static 这个 endpoint, 然后交给 Flask.send_static_file 函数处理,所以请求 /staic/api.json 就会返回 static 目录下的 api.json 文件。

    如果你设置 static_url_path='', 那么注册的静态文件处理路径就会变成 /<path:filename>, 所以任何不包含 "/" 的请求(因为 path converter 的正则是 "[^/].*?") 都会交给这条正则来处理。
    lisisi
        3
    lisisi  
    OP
       2019-03-25 19:43:34 +08:00 via Android
    @j0hnj 在设置了 app = Flask(__name__, static_url_path='') 之后,请求 /api.json 和 /static/api.json 都能访问到 api.json 这个文件。

    所以我理解设置 static_url_path='' 之后,系统对每个路由,都会匹配两次。一次是匹配静态文件 api.json,一次是匹配“ api.json ” 这个要不是静态文件,而是一个真的路由呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3448 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:13 · PVG 19:13 · LAX 04:13 · JFK 07:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.