Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 独立静态项目_Python_Python 3.x_Flask - Fatal编程技术网

Python 独立静态项目

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一起使用。我的项目目录类似于:

- flask
  - flaskr.py
  - projects
    - project1
      - index.html
      - css.css
      - js.js
    - project2
      - ...
    - ...
我试着只发送静态文件my
index.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
中的链接。