在子域上托管 Flask 应用程序(在主域上托管 WordPress)

时间:2021-03-04 08:38:37

标签: python flask subdomain namecheap

我希望你能在以下方面提供帮助,因为我已经努力让它工作了很多天。

为了给您一些背景知识,我曾经在我的网站 domain.xyz 上托管了一个 Flask 应用程序。它托管在 namecheap 上并通过 CPanel Python 应用程序运行。 然后我决定在同一个站点上也有一个 WordPress,所以我不得不将烧瓶移动到子域 api.domain.xyz

现在,Wordpress 站点可以正常工作,flask 应用程序的根页面 (api.domain.xyz) 也是如此。但是,烧瓶的所有其他路线都给了我相同的错误页面:

„ 未找到

在此服务器上找不到请求的 URL。

此外,在尝试使用 ErrorDocument 处理请求时遇到了 404 Not Found 错误。“

我使用 Namencheap 托管,并尝试了很多次支持,但他们坚持认为这是代码问题。我做错了什么?

这是python代码:

    #main.py
from flask import Flask, jsonify, request, abort
import os
from flask import g
import time
import socket

app = Flask(__name__, subdomain_matching=True)
#app.config["APPLICATION_ROOT"] = "/api"
#app.config["DEBUG"] = True

@app.before_request
def before_request():
    print("before request")
    g.start = time.time()
    

@app.route('/test', subdomain="api", methods=['GET'])
def test():
    return '''api'''
    
@app.route('/', methods=['GET'])
def home():
    print("HOME")
    return '''<p>This is the root page.</p>'''
 

@app.after_request
def after_request(response):
    diff = time.time() - g.start
    print ("Request time: " + str(diff))
    if ((response.response) and
        (200 <= response.status_code < 300) and
        (response.content_type.startswith('text/html'))):
        response.set_data(response.get_data().replace(
            b'__EXECUTION_TIME__', bytes(str(diff), 'utf-8')))
    return response

if __name__ == '__main__':
    app.run(host='api.domain.xyz', debug=True)

所以基本上,api.domain.xyz 正确路由并写入“这是根页面”,而 api.domain.xyz/test 显示错误。特别是,甚至没有调用 before_request 代码(我可以从日志中看出),这告诉我它永远不会进入代码。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

不完全确定这是否是您的问题,但flask 可能无法找到您的flask 程序,因此在该程序所在的目录中(以及已激活的任何虚拟环境)运行:

export FLASK_APP=<Your Python Program Name>

您可以通过运行测试它是否找到您的程序

flask run --host=0.0.0.0

很抱歉,如果这不起作用,但这是一个相当简单的解决方案,但已经发生了几次。

答案 1 :(得分:0)

原来代码没问题,但是文件夹结构不正确。似乎对于flask中的每条路线,文件夹结构中都需要有相应的文件夹。就我而言,我之前有过

├── api.domain.xyz
│   ├── main.py
│   ├── passenger_wsgi.py
│   ├── public
│   ├── tmp

我必须为每条路线添加一个单独的文件夹,在我上面的例子中:

    ├── api.domain.xyz
    │   ├── main.py
    │   ├── passenger_wsgi.py
    │   ├── public
    │   ├── tmp
    │   ├── test

如果你要添加更深的路由(比如“@app.route('/test/v1/resources', subdomain="api", methods=['GET'])”,你需要添加文件夹

│   ├── test/v1/resources

也一样。