将 Django 部署为独立的内部应用程序?

HoH*_*oHo 1 iis django wsgi cherrypy django-haystack

我正在使用 Django 开发一个工具,供我的组织内部使用。它用于搜索和标记文档(使用 Haystack 和 Solr),并将用于不同的项目。我的团队目前有一个工作原型,我们希望“在野外”部署它。

我们的安全环境很严格。项目文档位于网络驱动器上的子文件夹中,并且根据用户的 Windows 凭据限制对这些文件夹的访问(我们还有一个使用相同凭据的 MS SQL 服务器)。一个用户只能访问自己参与的项目。由于我们是微软的专卖店,如果我们想在公司内网部署我们的应用程序,我们需要使用一个IIS服务器来处理这些权限。团队中没有人具备使用 IIS、Active Directory 所需的知识,而且我们的 IT 部门已经人满为患。简而言之,我们不是网络开发人员,我们无法立即接触到任何有经验的人。

我的 hacky 解决方案是完全放弃 IIS,让每个最终用户在本地运行一个轻量级服务器(即 CherryPy),同时每个用户都保留对公共项目特定数据库的访问权限(例如,位于网络驱动器上的 SQLite DB 或 MS 上的 DB SQL 服务器)。为了使用该工具,他们只需启动一个多合一的批处理脚本并将浏览器指向127.0.0.1:8000. 我知道这有多丑陋,但我觉得它利用了已经到位的安全措施(请注意,在给定的项目中永远不要期望超过 10 个同时用户)。这是一个糟糕的主意吗,如果是这样,什么是更好的解决方案?

Lin*_*lle 5

我处理过类似的情况(主要开发面向正常部署情况,但有些用户需要在独立工作站上使用该应用程序)。我没有在独立工作站上部署 Web 和数据库服务器,而是使用 Django 内部开发服务器和 SQLite DB 运行该应用程序。我没有使用 CherryPy,但希望这对你有用。

我当前的解决方案为不熟悉命令行的用户(他们也难以记住要放入浏览器的 URL)提供了一个很好的可执行文件,但也相对容易开发:

  1. 使用PyInstaller将 Django 应用程序打包成单个可执行文件。一旦你弄清楚了,不要继续手工做,把它添加到你的持续集成系统中(或者至少写一个脚本)。
  2. 修改manage.py为:
    • 检测应用程序是否frozen由 PyInstaller 提供并且没有参数(即:用户通过双击它来执行它),如果是,则execute_from_command_line(..)使用参数运行以启动 Django 开发服务器。
    • 在运行 之前execute_from_command_line(..),弹出一个执行 a time.sleep(2)(让开发服务器完全启动)的线程,然后webbrowser.open_new("http://127.0.0.1:8000").
  3. 修改应用程序settings.py以检测是否冻结并更改周围的内容,例如数据库服务器的路径、启用开发服务器等。

一些额外的注意事项。

  • 如果您使用 SQLite,如果您并发写入数据库,则网络共享上的 Windows 文件锁定可能不够用;并发读者应该没问题。此外,由于您将针对不同的项目使用不同的 DB 文件,因此您必须想办法让用户指明要使用哪个文件。也许在应用程序中提示,或者使用不同的settings.py文件多次构建相同的应用程序。打这个钉子的各种方法......
  • 如果您使用 MSSQL(或任何客户端/服务器数据库),应用程序将必须知道数据库凭据(这意味着它们可以由知识渊博的用户提取)。这带来了可能无法接受的安全风险。基本上,不要试图在用户正在执行的应用程序中设置唯一的安全层。用户正在执行的应用程序使用的数据库凭据应该只有用户被允许的访问权限。