我需要使用 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_job
和 appname.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/