Pages

Friday, 26 August 2022

子目录部署Flask, 解决URL重定向错误

 

初学Flask的朋友,有一些是跟我一样纯为了娱乐,没有什么做项目的需求,也不会有太多接触服务器并部署项目的机会。这类人里不少会有自己的个人主页,相信不少人会想,能不能把自己的Flask小工具发布到个人主页的子目录下呢?

看过不少不懂装懂的人冒充专家一本正经地胡说八道说“开发Flask的哪会有机会在子目录部署项目?”或“Flask本身就是为了完整建站做考量的,谁会在子目录部署项目?”云云。这些人基本上是不太如流的初级程序员,没有见过大阵仗。因为在不同层级的目录配置不同项目在企业界是相当常见的,如果你只是单纯参加了一个小团队开发了一个小型app就在这胡说八道,那是误导热心群众。

我先说一下不少人的疑惑是什么,举一个网上看到的例子:

我在个人主页 http://abc.com 创建了一个叫app的子目录,部署了一个Flask程序,app一切正常。输入http://abc.com/app,一切正常。于是我开始增加一个登录功能,当用户访问首页http://abc.com/app时,如果发现用户没有登录,自动跳转到http://abc.com/app/login 却重定向到了http://abc.com/login,导致了404找不到页面的错误。我试了很多很多方法,都没搞定,求助大家。

关于这个问题怎么解答的都有,有人扯 URL_PREFIX,也有扯 APPLICATION_ROOT的,更有人哗众取宠说 “当然还有个办法是自己实现 url_for,但是你不一定能做好”。这种解决方式是完全找错了根源,虽然这是目录定向错误的问题,但根本原因不在于Flask项目本身的路径识别,因此跟PREFIX和APPLICATION_ROOT没有半毛钱关系。我还看到有人说Blueprint的,这个接近了,但还是没有绕出Flask本身的思维壁垒。

真正的解决方式,其实很简单,可以说超级简单,爆简单!因为根本问题不在于Flask项目本身内部结构,因为内部一通乱配置你还是会发现虽然路径看似对了但依然返回404。解决问题的根源在于自目录下.htaccess文件,一般无论GoDaddy也好,Bluehost 或者 Namecheap 也好,但凡使用cPanel的这类 web host基本上在你创建了Python 小程序后,会自动在自目录下创建一个.htaccess文件,包含 PassengerAppRoot, PassengerBaseURI 以及 PassengerPython 三行代码,你只需要在第四行加入一段

RewriteCond %{REQUEST_URI} !^/YourSubDirectory

完事.

No comments:

Post a Comment