2016-02-04 137 views
1

我正在开发一个工具,使用Django在我的组织内部使用。它用于搜索和标记文档(使用Haystack和Solr),并将用于不同的项目。我的团队目前有一个工作原型,我们想要在野外部署它。将Django作为独立的内部应用程序部署?

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

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

回答

4

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

我目前的解决方案带给用户不熟悉命令行(谁也记不住网址就摆在他们的浏览器),一个很好的可执行文件,但也比较容易发展:

  1. 使用PyInstaller包装将Django应用程序集成到单个可执行文件中。一旦你弄明白了,不要继续手动完成,将它添加到你的持续集成系统(或者至少写一个脚本)。
  2. 修改manage.py到:
    • 检测,如果应用程序是frozen通过PyInstaller并没有参数(即:用户通过双击执行它),如果是这样,那么运行execute_from_command_line(..)用参数来启动的Django开发服务器。
    • 就在运行execute_from_command_line(..)之前,请弹出一个线程,该线程执行time.sleep(2)(以使开发服务器完全启动),然后执行webbrowser.open_new("http://127.0.0.1:8000")
  3. 修改应用程序的settings.py检测是否冻结和改变周围的这样的事情的路径DB服务器,使开发服务器等

一对夫妇的其他注意事项。

  • 如果你使用SQLite,Windows file locking on network shares may not be adequate如果你有并发写入数据库;并发读者应该没问题。此外,由于您将针对不同的项目使用不同的DB文件,因此您必须找出让用户指出要使用哪个文件的方法。也许在应用程序中提示,或使用不同的settings.py文件多次构建相同的应用程序。各种各样的方法来打这个钉子...
  • 如果你去与MSSQL(或任何客户端/服务器数据库),应用程序将不得不知道数据库凭据(这意味着他们可以提取知识用户)。这提出了可能不可接受的安全风险。基本上,不要试图在用户正在执行的应用程序中拥有唯一的安全层。用户正在执行的应用程序使用的数据库凭据应该只有该用户被允许的访问权限。