python - 与 Flask 捆绑在一起的服务器在生产中使用是否安全?

标签 python flask werkzeug

与 Flask 捆绑在一起的服务器是否可以安全地部署在生产环境中?如果没有,我应该使用什么来在生产环境中部署 Flask?

最佳答案

。捆绑的服务器是 开发 服务器。它在设计时并未考虑到生产环境。

  • 默认情况下一次不会处理多个请求。
  • 如果您打开 Debug模式并弹出错误,它会打开一个 shell,允许在您的服务器上执行任意代码(想想 os.system('rm -rf/'))。
  • 开发服务器无法很好地扩展。

Flask 使用 Werkzeug 的开发服务器,文档也是这么说的:

The development server is not intended to be used on production systems. It was designed especially for development purposes and performs poorly under high load. For deployment setups have a look at the Application Deployment pages.

推荐的方法是use a production WSGI server运行您的 Flask 应用程序。文档中有一个专门用于部署的部分:Deployment Options .

部署您的应用程序就像安装 uWSGI 或 gunicorn 之类的 WSGI 服务器并运行它而不是 Flask 的开发服务器一样简单:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

如果您要提供图像或视频等任何静态 Assets 、需要低级缓存或有更高的并发需求,建议使用像 nginx 这样的网络服务器并让它处理您的所有请求。

糟糕的 ASCII 格式:

                +----------+
                | Client 2 |
                +----------+
                      |
                      V 
+----------+      +-------+      +----------+
| Client 1 |----->| nginx |<-----| Client 3 |
+----------+      +-------+      +----------+
                      ^
                      |
                      V
           /--------------------\
           | useful nginx stuff |
           | like asset serving |
           | and rate limiting  |
           \--------------------/
                      |
                      V
               +-------------+
               | WSGI server |
               +-------------+

要真正运行 WSGI 服务器进程,你可以使用Supervisor .如果由于某种原因失败,它会自动重新启动服务器,保留日志并作为守护程序运行,以便您的服务在服务器启动时启动。

关于python - 与 Flask 捆绑在一起的服务器在生产中使用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12269537/

相关文章:

python - 什么时候触发写入磁盘?

javascript - 无法将 jinja2 变量传递到 javascript 代码段中

python - 在单独的线程中启动 flask 应用程序

python - 当我在 gunicorn 上运行 Flask 应用程序时设置 app.wsgi_app = ProxyFix(app.wsgi_app) 会发生什么?

python - 我可以使用 werkzeug.security 的 check_password_hash 解密 Bcrypt 哈希密码吗

python - 无论环境如何,在 python 中打印 unicode 字符串

python - 根据行号删除数据帧的行

javascript - 如何使用 kartograph.js?

Python Flask - 如何使用 SubmitField 删除对象?

python - Flask/Werkzeug 请求对象表单参数