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

时间:2016-02-04 22:58:26

标签: django iis wsgi django-haystack cherrypy

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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