如何在自己的域中运行 Flask

Ric*_*rev 2 python flask server

我有一个带有域的服务器,例如https://my.site.com。但是当我启动 Flask 时,连接时域不起作用。有什么问题?

代码:

from flask import Flask, jsonify
import os

ASSETS_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)

@app.route('/')
def index():
    return 'Flask is running!'

if __name__ == '__main__':
    context = ('server.crt', 'server.key')
    app.run(debug=True, ssl_context=context, port=3030)
Run Code Online (Sandbox Code Playgroud)

并记录:

 * Running on https://127.0.0.1:3030/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 284-971-705
Run Code Online (Sandbox Code Playgroud)

我在浏览器中连接到https://my.site.com:3030,并且具有“永久加载”

Tim*_*mur 6

为了解决这个问题本身,日志表明您的 Flask 应用程序正在侦听 IP 127.0.0.1 (localhost):

Running on https://127.0.0.1:3030/
Run Code Online (Sandbox Code Playgroud)

这样 Flask 将只接受与此地址 (127.0.0.1) 建立的连接。相反,您需要启动 Flask 告诉它侦听服务器公共 IP 上的新连接。像这样:

flask run --host=PUBLIC_IP
Run Code Online (Sandbox Code Playgroud)

或者,简单地监听所有 IP:

flask run --host=0.0.0.0
Run Code Online (Sandbox Code Playgroud)

(其中0.0.0.0表示“操作系统可用的所有 IP”)

另请参阅:https ://flask.palletsprojects.com/en/1.1.x/quickstart/#public-server


生产中的烧瓶

根据问题的原始日志,似乎还有一些其他问题最好在投入生产之前解决。从安全角度来看,公开服务器(如上所述)而忽略这些项目是危险的,而且危险是非常真实的。特别是注册的 DNS,除了其最初的目的之外,还充当每个机器人的广告。由于主题本身较大,以下仅概述主要内容:

最小:

  • 禁用调试。调试器允许远程代码执行,并通过启用了调试器的服务器来服务“公共”请求是一个很大(巨大)且非常现实的安全风险。请参阅 Flask 中有关调试模式的更多信息

  • 生成并配置服务器机密。例如,服务器秘密用于签署 cookie,并且它必须是唯一的并且是秘密的。查看有关服务器机密的更多信息

  • 运行 WSGI 服务器而不是 Flask 开发服务器。当您启动时,flask run它会运行一个开发服务器,该服务器并非为性能或可靠性而设计。然而,使用 Flask 框架实现的应用程序是有效的 WSGI 应用程序,并且可以由任何 WSGI 服务器软件提供服务,例如 uWSGI、gunicornwaitress等一些流行的软件。

通常也:

  • 在反向代理(例如nginx)后面运行 Flask 服务器。反向代理可以以非常有效(就性能而言)的方式处理大量功能,例如提供静态文件、提供 SSL 终止(http s)、压缩、缓存等。

  • 考虑保留 Flask 应用程序日志。如果遇到任何麻烦,您可能想了解发生了什么。默认情况下,Flask 日志定向到标准输出,并且在服务器重新启动时不会保留。(因此所有过去的日志都将丢失)。

投入生产的检查清单肯定会不断地出现,但我认为以上是必须解决的事项,以避免出现严重的问题。


或者,您可以考虑其他选项来处理大多数典型的“生产”配置。下面的选项可能是一个好主意,因为这样您将依赖专家制作的现有且得到良好支持的配置。例如:

  • 部署到托管服务,例如AWS ElasticBeanstalk、Heroku等。
  • 如果您希望对环境有更多控制,请考虑将应用程序打包到基于一些受良好支持的基础映像的 Docker 映像中,并预先配置上述一些项目(例如: https: //github.com/tiangolo/uwsgi -nginx-flask-docker )

也可以看看: