【问题标题】:Running Python script in Django from submit从提交在 Django 中运行 Python 脚本
【发布时间】:2015-04-30 20:46:47
【问题描述】:

也许有一种不同的方法可以解决这个问题,但我对使用 Django 还是很陌生。

我编写了一个自定义 Python 脚本,并希望在用户按下网页上的“提交”按钮时运行一个函数或 .py 文件。

如何使用 Django 从提交按钮获取要传递给 Python 函数的参数?

【问题讨论】:

  • 您可以通过 post 请求传递它
  • 类似于
    的东西?如果是这样,我如何将那里的信息带入该特定功能。把它全部联系起来让我很困扰

标签: python django django-forms


【解决方案1】:

通常所做的是让表单提交一个发布请求。然后,您将在您的 urls.py 中拦截该请求,您将在其中调用您的函数。因此,如果您的表单如下所示:

<form action="submit" method="post">
    <input type="text" name="info"><br>
    <input type="submit" value="Submit">
</form>

你的 urls.py 会是这样的:

url(r'^submit', views.submit)

您的 views.py 将具有获取通过帖子传递的参数的函数:

def submit(request):
    info=request.POST['info']
    # do something with info

这个link给出了更深入的解释。

【讨论】:

  • 这样做会出现以下错误:AttributeError: 'module' object has no attribute 'submit'。 这是什么原因?注意:表单位于名为 header.html 的文件中
  • @tiagoperes 我会检查以确保您已在您正在使用的视图上定义了提交函数
  • 看起来是这样的: def submit(request): if request.method== 'POST': info=request.POST['name'] # do something with info
  • 就像您的答案一样,但使用名称而不是信息
【解决方案2】:

在谷歌上搜索了几天后,我设法就这个问题拼凑了一些解决方案,这是我的项目所需要的。

SwankSwashbucklers 给出了一般方法,我只是想添加它以完成循环。这可能不是唯一的解决方案,所以我只给出一个工作示例。所以..你的模板应该包含以下代码(如上所示,还有一些额外的):

your_template.html

{% extends base.html %}
{% block main_content %}
<form action="your_view_url" method="post">{% csrf_token %}
  {{ form.as_table }}
  // <input type="text" name="info_name" value="info_value">
  <input type="submit" value="Submit">
</form>
<p> Post Data: {{ info }} </p>
<p> Result: {{ output }} </p>
{% endblock main_content %}

如果您在 forms.py 中定义了您的表单和/或使用您的模型进行表单呈现,那么检查呈现的 HTML 以找出 Django 在表格。 “值”是您的 POST 请求中将提交的内容。

您定义的视图将显示表单,并且在提交后也会对其进行处理,因此您将在其中包含 2 个带有“if”语句的部分。 Django使用“GET”打开视图,所以初始渲染显示空白表单

views.py

import subprocess

def your_view_name(request):
  if request.method == 'GET':
    form = your_form_name() 
  else:
    if form.is_valid():
      info = request.POST['info_name']
      output = script_function(info) 
      // Here you are calling script_function, 
      // passing the POST data for 'info' to it;
      return render(request, 'your_app/your_template.html', {
        'info': info,
        'output': output,
      })
  return render(request, 'your_app/your_template.html', {
    'form': form,
  })

def script_function( post_from_form )
  print post_from_form //optional,check what the function received from the submit;
  return subprocess.check_call(['/path/to/your/script.py', post_from_form])  

forms.py

class your_form_name(forms.Form):
  error_css_class = 'error' //custom css for form errors - ".error";
  required_css_class = 'required' //custom css for required fields - ".required";
  info_text = forms.CharField()

当您调用 form = your_form_name() 时,“info_text”将在模板中呈现为“输入”字段中的内容。更多关于 Django 表单的信息在这里https://docs.djangoproject.com/en/1.9/ref/forms/fields/

当您按下提交时,表单会将数据提交回自身,因此您的视图会选择它是一个 POST 并运行 is_valid ,然后是 output 的值strong> 将是 subprocess.check_call 返回的错误代码。如果您的脚本运行正常,“输出”的值为“0”。

这适用于“Django 1.4”和“Python 2.6”。最新版本具有 subprocess.check_output,它实际上可以从脚本返回输出,因此您可以将其渲染回模板上。

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    在 django 1.11 和 python 3.6 中,我不得不使用

    return subprocess.run(['python', 'path_to_script//prog17.py', post_from_form], shell=False, timeout=1800)
    

    @kossta 的其余代码运行良好。

    【讨论】:

      【解决方案4】:

      @SwankSwashbucklers 所说的是要走的路。

      如果您还想将脚本与视图分开,您还可以使用custom management command 并使用call_command 在视图中调用它。这样,您也可以使用manage.py mycommand [myargument] 从命令行运行脚本。

      【讨论】:

        【解决方案5】:

        除了最后一部分(调用 python 脚本),@kosstas 的代码在我的系统中运行良好。我正在分享我的不同之处。我正在使用 Python 3.8Django 3.1。 我必须使用 -

        return subprocess.run(['python', 'windows_path_like_D:\\path_to_script\\prog17.py', post_from_form], shell=False, timeout=1800)
        

        此代码未在我的系统中显示输出。要查看输出,我必须用“stdout=PIPE”代替“timeout=1800”。那就是:

        output = run([sys.executable,'windows_path_like_D:\\path_to_script\\prog17.py', model_name], shell=False, stdout=PIPE)
        

        为此,我必须包括:

        from subprocess import run, PIPE
        

        立即看到自己眼中的输出让我松了一口气!

        【讨论】:

          【解决方案6】:

          python manage.py

          这里的脚本名称是你的python文件。不用说.py扩展名。

          【讨论】:

          • 我不明白你的意思。
          猜你喜欢
          • 2017-09-17
          • 2014-10-01
          • 2014-05-09
          • 2015-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多