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

Mat*_*att 6 python django

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

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

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

nea*_*ick 6

通常情况下,您的表单会提交一个帖子请求.然后,您将在urls.py中拦截请求,您可以在其中调用您的函数.所以如果你的表单看起来像这样:

<form action="submit" method="post">
    <input type="text" name="info"><br>
    <input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)

你的urls.py会有这样的东西:

url(r'^submit', views.submit)
Run Code Online (Sandbox Code Playgroud)

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

def submit(request):
    info=request.POST['info']
    # do something with info
Run Code Online (Sandbox Code Playgroud)

链接提供了更深入的解释.


小智 5

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

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 %}
Run Code Online (Sandbox Code Playgroud)

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

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

视图.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])  
Run Code Online (Sandbox Code Playgroud)

表格.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()
Run Code Online (Sandbox Code Playgroud)

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

当您按下提交,表单将数据提交回自己,所以你的观点会选择它的一个POST和运行is_valid,然后值输出将被返回的错误代码subprocess.check_call。如果您的脚本运行正常,“输出”的值将为“0”。

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

希望这可以帮助:)