从提交中运行Django中的python脚本

时间:2015-04-30 20:46:47

标签: python django

也许有一种不同的解决这个问题的方法,但我对使用Django相当新。

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

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

5 个答案:

答案 0 :(得分:6)

通常情况下,您的表单会提交一个帖子请求。然后,您可以在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给出了更深入的解释。

答案 1 :(得分: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在“值”属性中所给出的内容。表格。 “value”是您在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 ,然后运行输出值将是 subprocess.check_call 返回的错误代码。如果脚本运行正常,则“output”的值将为“0”。

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

希望这会有所帮助:)

答案 2 :(得分:0)

@SwankSwashbucklers说的是要走的路。

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

答案 3 :(得分:0)

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

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

@ kossta代码的其余部分工作正常。

答案 4 :(得分:0)

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

feb_buckets = [[] for item in range(10)] #  this makes a list of 10 buckets (lists)
aug_buckets = [[] for item in range(10)]
for feb, aug in zip(feb_numbers,aug_numbers):
    feb_bucket[feb//10].append(feb) #  // is integer division (which rounds down)
    aug_bucket[aug//10].append(aug)

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

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

为此,我必须在顶部包含:

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

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