jquery - 如何从html中单击事件的下拉按钮调用django中的外部python脚本

标签 jquery python django jenkins

我需要使用 Django+Python 从前端按钮运行 Jenkins 作业。 我用带有下拉按钮的html制作了一个标题。通过阅读许多帖子,我了解到我可以使用 AJAX 触发我的 Jenkins 作业。有人可以告诉我如何使用 view.py 的示例片段来做到这一点,以及如何在触发点击事件时将其重定向到新的 HTML 页面。

home.html

<div class="row">
    <div class="col-sm-2">
        <br><br>
        <div class="well bs-sidebar" id="sidebar" style="background-color:#fff">
            <ul class="nav nav-pills nav-stacked">
                <h4>Application B <span class="badge badge-secondary"></span></h4>
            </ul>
        </div>
    </div>

    <div class="col-sm-10">
        <h3>ACTIONS ALLOWED</h3>
        <br>
        <div class="dropdown">
            <button class="btn btn-success btn-md"  type="button" onclick="" data-toggle="dropdown">
                List of scripts available
                <span class="caret"></span>
            </button>
            <ul class="dropdown-menu">
                <li><a href="#">Healthcheck</a></li>
                <li><a href="#">Regresseion Testing</a></li>
                <li><a href="#">Functional Testin</a></li>
                <li><a href="#">Unit Testing</a></li>
                <li class="divider"></li>
            </ul>
            <button class="btn btn-warning btn-md">
                Cick to see the results
            </button><br>
        </div>
    </div>
</div>

<script>
    $(document).ready(function() {
        $('.btn-success').tooltip({title: "Execute", animation: true}); 
        $('.btn-warning').tooltip({title: "Results!@", animation: false}); 
    });
</script> 

urls.py

from django.conf.urls import url
from . import views
urlpatterns=[
   url(r'^$', views.index, name='index'),
   url(r'^hello', views.hello, name='hello'),
]

最佳答案

作为新手,您正在处理一个有点高级的 Django 主题,但它应该是可行的。请注意,这是一个非 Ajax python-only 解决方案,不确定它是否正是您正在寻找的,但这将是 Django 项目的常见模式。

创建一个 View (连接到一个 URL),它将触发一个外部 python 脚本并显示一条消息。 View 可以像这样简单:

def fire_job(request):
    exec(open('/path/to/external/script.py').read())
    return render(request, 'some_template.html', {})

模板可以说例如“工作已经开始。请查看您的电子邮件以获取更新。”为 View 创建一个 URL 并从您的导航链接到它。

这基本上可以工作,但有一个大问题:默认情况下 Python 是同步的,因此用户在作业完成之前不会看到页面。

旁白:在开发过程中,尝试调用一个可以快速执行但可能包含类似内容的虚拟脚本:

import time
time.sleep(10) # 10 second artificial delay

稍后,当一切正常时,将虚拟脚本的路径替换为真实的路径。

现在您需要一个队列系统,它可以让您在后台启动进程但立即返回页面,并在作业完成时发送电子邮件。一个常见的解决方案是使用 Celery , 但我更喜欢 Django_Q因为它实现起来更简单,移动部件更少。

这可能是使用 Django_Q 完成它的最简单方法(并且在单独的终端中运行 ./manage.py qcluster):

def myview(request):
    from django_q.tasks import async, result
        task_id = async(
            'appname.tasks.fire_job',  # dotted path to function
            hook='appname.tasks.report'  # Runs when task completes
        )
        return render(request, 'some_template.html', {})

您现在需要创建这两个函数:appname.tasks.fire_jobappname.tasks.report,更改路径以匹配您的项目。第一个是调用外部脚本的简单函数:

# appname/tasks.py
def fire_job():
    exec(open('/path/to/external/script.py').read())

另一个在该工作完成时被解雇(例如发送电子邮件):

   # appname/tasks.py
   def report():
        # See Django docs on how to send email

这有点简化,但应该可以让您继续。祝你好运!

关于jquery - 如何从html中单击事件的下拉按钮调用django中的外部python脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46440037/

相关文章:

如果 CSS 值有条件,则为 Javascript

javascript - 使用 jQuery 防止回发并运行 OnClick

jquery - Javascript 求和不正确?

jQuery,动态表单生成 - 清空克隆的输入字段?

python - Tkinter/Python - 调整窗口大小时禁用按钮大小调整

python - 如何在 Django/Python 中自动填充 PDF 表单?

javascript - 201 创建由 django Rest 框架发送的状态代码,通过 jquery $.ajax 调用解释为失败

django - 在django中批量创建模型对象

python - 有人知道 Python 中的工作流框架/库吗?

python - 简单并发代码中的 "Coroutine was never awaited"