与Flask框架配置Lighttpd的重写问题

2 投票
3 回答
1008 浏览
提问于 2025-04-16 17:46

我在使用Flask自带的服务器时,顺利地运行和开发了我的应用,一切都很顺利,感觉也很有趣。不过,部署到Lighttpd上总是让我头疼。我尽量按照说明来操作,但我的应用还是没能正常工作。

这是我目前的配置:

server.modules   += ( "mod_fastcgi" )
server.modules   += ( "mod_rewrite" )

fastcgi.server = ("/bioinfo/main.fcgi" =>
    ((
        "socket" => "/tmp/bioinfo-fcgi.sock",
        "bin-path" => "/var/www/bioinfo/main.fcgi",
        "check-local" => "disable",
        "max-procs" => 1
    ))
)
fastcgi.debug = 1

url.rewrite-once = (
    "^/bioinfo/static/(.*)$" => "/bioinfo/static/$1",
    "^/bioinfo/(.*)$" => "/bioinfo/main.fcgi/$1"
)

# in: /etc/lighttpd/conf-available/10-fastcgi.conf

这个配置能正常显示主页,但后面的页面就不行了。

在我的Flask应用中,有几个app.route处理器,我通过GET或POST请求来访问它们,使用的是客户端的一些XHR。

另外,这是我的.fcgi文件,想确认一下这里没有明显的错误:

#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from main import app

if __name__ == '__main__':
    WSGIServer(app).run()

如果有人能找出问题所在,特别是AJAX在应用的URI上不工作(很可能是因为我的重写规则有问题),我会非常感激。提前谢谢大家!

3 个回答

0

我也遇到过同样的问题。对我来说,解决办法是在fcgi文件中,在主函数之前添加这一段代码:

class ScriptNameStripper(object):
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        environ['SCRIPT_NAME'] = ''
        return self.app(environ, start_response)

app = ScriptNameStripper(app)

测试的时候一定要清除浏览器缓存哦。

0

我知道这个回复是来自未来很久的时间,但我遇到了类似的问题,发现对我有效的解决办法是确保在我的模板中使用了 url_for。希望你也能解决这个问题!

0

你需要手动切换到你的应用程序运行的目录。

撰写回答