【问题标题】:Running a linux command from Django views. Works fine in python shell. Won't execute from views从 Django 视图运行 linux 命令。在 python shell 中工作正常。不会从视图执行
【发布时间】:2013-07-16 01:11:16
【问题描述】:

我尝试过同时使用 subprocess() 和 os.system()

import os
def whatever(request):
    open file
    code write to file
    close file
    os.system(command theFileIwroteto argument)

现在代码很好。我已经打开了 python 并从字面上复制并粘贴了确切的命令,它工作正常。

蟒蛇:

import os
os.system(command theFileIwroteto argument)

为什么它可以使用 python shell 工作,但拒绝从 django 视图文件执行?

【问题讨论】:

  • 如何运行视图?您将其标记为 apache,这会让我认为您将其作为 wsgi 运行(而不是 django 开发服务器等)。您在运行什么操作系统?
  • 你收到IOError: sys.stdout access restricted by mod_wsgi了吗?

标签: python django apache


【解决方案1】:

您应该查看错误日志以便做出正确的诊断。

没有更多信息,我可以想到两个原因:

  1. Apache mod_wsgi 限制对标准输出的访问,并且您正在运行的命令输出到标准输出。如果您使用的是 mod_wsgi,请在日志中查找 IOError: sys.stdout access restricted by mod_wsgi 之类的错误;
  2. 您正在以您的用户或根用户身份登录时测试您的命令,但网络服务器正在以具有较少权限的其他用户身份运行(如 Ubuntu 中的 www-data)。找出网络服务器在哪个用户下运行,su 给同一用户并尝试相同的命令。任何错误都会提示您缺少权限。

从 Django 视图运行 shell 几乎总是一个坏主意,特别是如果命令需要几秒钟才能运行。它的可扩展性很差,使某人更容易对您的站点进行 DDoS 攻击,并且响应速度很慢。正确的做法是将作业放在队列中,并让一个或多个后台进程使用该队列。看看celery,它在这类任务中很受欢迎。

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 1970-01-01
    • 2011-06-15
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多