Python 独立静态项目
我有几个已经完成的、自包含的静态项目,我想与Flask一起使用。我的项目目录类似于:Python 独立静态项目,python,python-3.x,flask,Python,Python 3.x,Flask,我有几个已经完成的、自包含的静态项目,我想与Flask一起使用。我的项目目录类似于: - flask - flaskr.py - projects - project1 - index.html - css.css - js.js - project2 - ... - ... 我试着只发送静态文件myindex.html: @app.route('/proj1') def proj1(): return app
- flask
- flaskr.py
- projects
- project1
- index.html
- css.css
- js.js
- project2
- ...
- ...
我试着只发送静态文件myindex.html
:
@app.route('/proj1')
def proj1():
return app.send_static_file("projects/index.html")
然而,它对css.css
和js.js
的引用随后指向/css.css
和/js.js
,而不是/projects/project1/css.css
和/project1/js.js
我还尝试在调用send\u static\u file
之前修改app.root\u路径
,然后将其重置,但结果总是404
在
之后插入一个
标签似乎很有效,但我觉得有点不舒服。我想找到一个更“正确”的解决方案
我怎样才能做到这一点?我不想修改项目中的任何代码;它应该尽可能地拖放。据我所知,发送静态文件只发送静态文件,不进行重写或任何操作。因此,文件到达客户机时与在文件系统上一样 浏览器获取
/proj1
,并获取一个HTML文件,其中显示“还下载css.css
,并将其添加到此文档”。浏览器不知道HTML文件最初位于/projects/project1/index.HTML
,它只知道它已被访问/proj1
。因此它查找与其访问的文件相关的css.css
文件,因此它查找/css.css
如果您通过/projects/project1/index.html
(或位于/projects/project1/
中的任何其他路径)提供index.html
在中,相对查找将导致/projects/project1/css.css
,我概述了出现此问题的原因,并提出了解决方案,以便浏览器可以推断资源的正确位置。另一种可能性是flask可以找出浏览器实际需要的资源。“正常情况下”浏览器会发送一个请求(尽管也有例外),我们可以用它来推断哪个css.css
是指:
from flask import request
@app.route('/css.css')
def css():
r = request.referrer
if r.endswith("proj1"):
app.send_static_file("projects/project1/css.css")
这是一个相当粗糙的方法,我个人不建议这样做,基本上你要么必须对项目进行硬编码,要么实施一些注册来实现自动化。正如@jpmc26所说,这个问题从一开始就错了。烧瓶应用于动态现场,且过度杀灭且不适合此用例。相反,建议使用像Nginx这样的web服务器。如果需要动态内容,Nginx将能够将请求路由到子Flask服务器。为什么要使用Flask而不是apache或Nginx这样的Web服务器?(这并没有改变任何东西,我只是好奇。)@syntonym我对Flask很熟悉,所以这是我的任何网络托管的目标。而且,这种行为只是项目的一部分;还有更多“烧瓶式”的东西。我相信你已经看到了,但在这种情况下你没有看到(或者其他阅读你的问题的人没有看到)。祝你的项目好运@奎克勒夫:我不只是好奇。我将做出一个非常有力的声明:使用动态web应用程序引擎来服务一个完全静态的站点是不称职的。了解您的web服务器(Nginx、IIS)。您应该已经有点熟悉了,因为您现有的Flask应用程序应该落后于prod中的一个。Flask确实有一个用于的机制,但您需要1。应该更愿意让web服务器在prod和2中绕过此路由的Flask。仅将其用于动态应用程序所需的资源文件(例如,CSS、JS、图像)。我将注意,让动态应用程序服务静态文件至少有一个用例:当您需要对静态文件进行访问控制时。但在本例中,端点实际上是动态的,尽管内容是静态的。端点必须访问用户存储,允许用户登录/注销,并在每次发出请求时检查用户的权限。感谢您的解释!我将等待一段时间,看看是否会出现另一个更灵活的解决方案,如果没有,请接受您的回答。您可以“手动”阅读
index.html
文件,并替换指向/projects/projectX
的任何链接,但对我来说,这可能会有点不方便。在您的上下文中,它可能仍然是一个很好的解决方案。我想您也可以读出Referer
标题,并使用适当的css/js进行回答。我不确定sol'n的Referer
sol'n会如何工作,但我目前的方法是通过编程插入
标记,类似于替换index.html
中的链接。