在Django中执行外部脚本的推荐做法是什么?

时间:2019-01-03 14:39:01

标签: python

我正计划构建一个WebApp,它将需要根据用户将在文本字段或Url中提供的参数来执行脚本。

我发现的

可能的解决方案:

  1. 在项目的根目录中创建一个lib目录,并将脚本放在此处,然后从视图中将其导入。

  2. 使用子流程模块通过以下方式直接运行脚本:

    subprocess.call(['python', 'somescript.py', argument_1,...])
    

argument_1:应该是最终用户提供的。

2 个答案:

答案 0 :(得分:0)

  

我正计划构建一个需要执行脚本的WebApp

为什么要“执行脚本”? Turn your "scripts" into proper modules,导入相关函数并调用它们。可以将Python 用作“脚本语言”这一事实并不意味着它不是适当的编程语言。

答案 1 :(得分:-1)

方法(1)应该是默认方法。除非绝对必要,否则请勿进行子处理。

子处理的缺点:

  1. 取决于底层操作系统以及您所使用的Python(即python命令是否与运行原始脚本的Python相同?)。
  2. 可能很难确保安全。
  3. 努力传递值,返回结果并报告错误。
  4. 吃更多的内存和cpu(副作用是您可以利用所有cpu内核,但是由于您正在编写Web应用程序,因此无论如何都可以这样做)。
  5. 通常更难编写和维护。

子处理的优点:

  1. 隔离运行时。例如,如果脚本是由用户上传的,则这很有用。您不希望他们弄乱您的应用程序。
  2. 与1相关:可能更容易动态添加脚本。并不是说您还是应该这样做。当您拥有多于1台服务器并且需要同步它们时,也会变得更加困难。
  3. 好吧,您可以通过这种方式运行非python代码。但这不适用于您的情况。