在Django中使用来自views.py的值运行python脚本

时间:2014-07-25 00:16:22

标签: python django python-2.7 django-views views

我试图将Django中的views.py文件中的值传入我编写的另一个python脚本中,但我不知道该怎么做。这是来自views.py文件的代码:

    def get_alarm_settings(request):
      if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        alarm = Alarm.objects.all()[0].alarm_setting
        response = HttpResponse(alarm, content_type='text/plain')
        response_a = execfile('alarm_file.py')
        return response_a

我正在尝试将响应传递给alarm_file.py,有人知道该怎么做吗?

4 个答案:

答案 0 :(得分:6)

根据问题的评论,在alarm_file.py中创建函数并导入它。要使python alarm_file.py调用同样,请使用if __name__ == '__main__': alarm_file.py。它将包含在调用python alarm_file.py时运行的逻辑。此外,您可以使用sys.argv获取参数,并在命令行中传递。例如:

alarm_file.py:

import sys

def do_something(val):
    # do something
    print val
    # return something
    return val

if __name__ == '__main__':
    try:
        arg = sys.argv[1]
    except IndexError:
        arg = None

    return_val = do_something(arg)

这将确保您可以简单地运行:python alarm_file.py some_argument

在您的视图中,只需从alarm_file导入函数并使用它:

from alarm_file import do_something
...
        response = HttpResponse(alarm, content_type='text/plain')
        response_a = do_something(response)
        return response_a

答案 1 :(得分:0)

您可以使用流程响应中间件来处理从view方法返回的响应,更多详细信息可以在此处找到https://docs.djangoproject.com/en/dev/topics/http/middleware/#process-response

答案 2 :(得分:0)

你不能使用execfile()传递参数,如果你想调用另一个解释器实例并运行脚本,你应该使用subprocess.popen (suprocess docs

这样的事情: subprocess.Popen(['alarm_file.py','arg1',...],...,shell = True)

答案 3 :(得分:0)

我建议您使用 Subprocess 模块的 Popen 方法。

例如:

process = Subprocess.Popen(['python','alarm_file.py','arg1','arg2'], stdout=PIPE, stderr=STDOUT)
output = process.stdout.read()
exitstatus = process.poll()

在此示例中,脚本的stderr和stdout保存在变量' output '中,脚本的退出代码保存在变量' exitstatus '中。 / p>

您可以参阅我的博客以获取详细说明>>

http://www.easyaslinux.com/tutorials/devops/how-to-run-execute-any-script-python-perl-ruby-bash-etc-from-django-views/