我怎样才能在我的站点子域中使用我的 flask-app 运行?
How can I have my flask-app run on my sites subdomain?
例如,我想在 http://api.domain.com 上 运行 flask-app。但是,我不知道该怎么做,烧瓶文档也没有帮助。我正在通过 SSH 使用共享的 namecheap Web 服务器到 运行 python。我打开了端口 8080、8181 和 8282。
服务器端代码:
from flask import Flask
from flask import Blueprint
app = Flask(__name__)
app.config['SERVER_NAME'] = 'domain.com'
@app.route('/status')
def status():
return 'Status : Online'
bp = Blueprint('subdomain', __name__, subdomain="api")
app.register_blueprint(bp)
if __name__ == '__main__':
app.run(host=app.config["SERVER_NAME"],port=8181,debug=True)
当我访问 http://www.api.domain.com/status 时,它 returns 出现 404 错误。
SSH 控制台上没有任何显示。
非常感谢任何帮助。
要事第一:
http(即没有 SSL 证书的网络服务器)不安全。你应该设置一个证书,并且始终使用端口 443 到外部。
然后,在namecheap上,您需要定义一个CNAME条目来指向子域。
在 Namecheap 中,单击域 -> 管理,然后单击高级 DNS
新建一条记录,selectType为CNAME,HOST为子域名(只是顶级),然后你服务器的IP为值(TTL(时间到live) 是当你下次想要更改它时更改它所花费的时间,1、10 分钟对于调试东西很有用,但无论如何 DNS 可能不会遵守...)
稍等几分钟,您应该可以通过子域名访问您的服务器。
现在,例如,如果您使用与网络服务器相同的 IP,但使用不同的端口,那基本上无法满足您的要求。 DNS 会将子域流量转发到您的(相同)服务器 IP,因此如果您的网络服务器位于端口 443 上,您也可以通过 https://api.domain.com 访问它。如果您的 API 使用端口 8080 或 8081,您将需要始终指定端口以实际到达子域中的 API 服务器(即 api.domain.com:8080 )。
DNS 只是将子域名转发到您指定的 IP。
我在 Python 中使用龙卷风解决了这个问题。我已经回答了这个问题并且它工作正常
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(int(5000),address="ip_address_of_your_server_machine")
IOLoop.instance().start()
现在您可以像www.example.com:5000
一样访问此页面
实际上 Flask 本身并不打算 运行 服务器,它仅用于调试,如果你想 运行 一个网络应用程序,你应该 运行 在 Apache 或 Nginx 后面使用一些 wsgi,这是 Ubuntu 18.04 LTS 上的一个简单示例:
https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uswgi-and-nginx-on-ubuntu-18-04
例如,我想在 http://api.domain.com 上 运行 flask-app。但是,我不知道该怎么做,烧瓶文档也没有帮助。我正在通过 SSH 使用共享的 namecheap Web 服务器到 运行 python。我打开了端口 8080、8181 和 8282。
服务器端代码:
from flask import Flask
from flask import Blueprint
app = Flask(__name__)
app.config['SERVER_NAME'] = 'domain.com'
@app.route('/status')
def status():
return 'Status : Online'
bp = Blueprint('subdomain', __name__, subdomain="api")
app.register_blueprint(bp)
if __name__ == '__main__':
app.run(host=app.config["SERVER_NAME"],port=8181,debug=True)
当我访问 http://www.api.domain.com/status 时,它 returns 出现 404 错误。 SSH 控制台上没有任何显示。
非常感谢任何帮助。
要事第一:
http(即没有 SSL 证书的网络服务器)不安全。你应该设置一个证书,并且始终使用端口 443 到外部。
然后,在namecheap上,您需要定义一个CNAME条目来指向子域。
在 Namecheap 中,单击域 -> 管理,然后单击高级 DNS
新建一条记录,selectType为CNAME,HOST为子域名(只是顶级),然后你服务器的IP为值(TTL(时间到live) 是当你下次想要更改它时更改它所花费的时间,1、10 分钟对于调试东西很有用,但无论如何 DNS 可能不会遵守...)
稍等几分钟,您应该可以通过子域名访问您的服务器。
现在,例如,如果您使用与网络服务器相同的 IP,但使用不同的端口,那基本上无法满足您的要求。 DNS 会将子域流量转发到您的(相同)服务器 IP,因此如果您的网络服务器位于端口 443 上,您也可以通过 https://api.domain.com 访问它。如果您的 API 使用端口 8080 或 8081,您将需要始终指定端口以实际到达子域中的 API 服务器(即 api.domain.com:8080 )。
DNS 只是将子域名转发到您指定的 IP。
我在 Python 中使用龙卷风解决了这个问题。我已经回答了这个问题并且它工作正常
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(int(5000),address="ip_address_of_your_server_machine")
IOLoop.instance().start()
现在您可以像www.example.com:5000
实际上 Flask 本身并不打算 运行 服务器,它仅用于调试,如果你想 运行 一个网络应用程序,你应该 运行 在 Apache 或 Nginx 后面使用一些 wsgi,这是 Ubuntu 18.04 LTS 上的一个简单示例: https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uswgi-and-nginx-on-ubuntu-18-04