【问题标题】:Adding python script to views.py in django and firing with button click将python脚本添加到django中的views.py并点击按钮触发
【发布时间】:2020-05-28 23:54:53
【问题描述】:

这里是新手。

尝试制作一个网络应用程序,当按钮时生成并显示随机视频 在 django 页面上被点击。

我有一个生成视频的 python 脚本。

我有一个 django 项目,其中包含 templates/home.html、views.py、urls.py 和 我的python脚本videogenfull.py在里面。现在看起来像这样..


views.py: 

from django.http import HttpResponse 
from django.shortcuts import render

def home_view(request, *args, **kwargs): 
    print(args, kwargs) 
    print(request.user) 
    return render(request, "home.html", {})


urls.py: 

from django.contrib import admin 
from django.urls import path

from pages.views import home_view

urlpatterns = [ 
    path('', home_view, name='home'), 
    path('admin/', admin.site.urls)
]

videogenfull.py - 从网络上随机抽取视频,对其进行编辑并将它们导出为一个(非常小的)视频。我已经设置了一个静态文件夹,生成的视频将转到该文件夹​​,并在 home.html 中放入一些 html 代码以播放视频。

html 页面已成功显示在我的浏览器中 - 文本标题和临时视频现在。

接下来我知道我需要:

  • 在我的 html 文件中创建一个 html/ajax/jquery 按钮
  • 在views.py 中编写一些代码以获取videogenfull.py,以便在单击按钮时触发

我已经在最后一部分做了很长一段时间了,但不知道该怎么做。 这是我需要做的吗?

home.html:

<button id="myClickButton" type="button">Click</button>
<div id="myOutput"></div>

$("#myClickButton").click(function() {
    $.get("/output/", function(data) {
        $("#myOutput").html(data);
    }, "html");
});

views.py:

def index(request):
    return render(request, 'yourapp/index.html')

谢谢!

【问题讨论】:

  • 首先在view.py 中编写一些函数,该函数至少呈现文本"Hello World",并在path('output/', ...) 中分配此函数。并测试单击按钮时是否会看到"Hello World"。以后你可以在这个函数中做一些更有用的事情。
  • 我可以像我在这里展示的那样实现“Hello World”,但是如何放入views.py并在按钮单击时激活? def home_view(request, def home_view(request, *args, **kwargs): print(args, kwargs) print(request.user) return HttpResponse("&lt;h1&gt;Hello World&lt;/h1&gt;")
  • 你必须将此函数分配给 url urlpatterns = [ path('output/', home_view, name='home'), ...] 然后按钮将使用它。但似乎你已经有其他功能home_view 所以也许改名def output_view ... 然后urlpatterns = [ path('output/', output_view, name='output'), ...]
  • 我收到此错误消息 - 仍在处理中 -"使用 trydjango.urls 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式: output/ [name='output'] The empty路径与其中任何一个都不匹配。”
  • 这就是我做网址的方式....from pages.views import output_view urlpatterns = [ path('output/', output_view, name='output'), ]

标签: python html jquery django ajax


【解决方案1】:

首先在views.py中创建函数

from django.http import HttpResponse 
from django.shortcuts import render

def home_view(request, *args, **kwargs): 
    print(args, kwargs) 
    print(request.user)
    return render(request, "home.html")

def output_view(request):
    return HttpResponse("<h1>Hello World</h1>")

接下来你必须将它分配给 urls.py 中的 url output/

from django.contrib import admin
from django.urls import path

from pages.views import home_view, output_view

urlpatterns = [
    path('', home_view, name='home'), 
    path('output/', output_view, name='output'), 
    path('admin/', admin.site.urls),
]

你必须在home.html中使用&lt;script&gt;

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

<button id="myClickButton" type="button">Click</button>

<div id="myOutput"></div>

<script>
  $("#myClickButton").click(function() {
    $.get("/output/", function(data) {
      $("#myOutput").html(data);
    }, "html");
  });
</script>

如果它有效,那么您可以尝试在函数output() 中使用videogenfull.py。但它可能需要更多的工作,所以我只能展示如何使用它的想法。

您可以将其作为子进程运行

import subprocess

def output_view(requests):
    subprocess.run(["python", "videogenfull.py"])
    return HttpResponse("<h1>Hello World</h1>")

或者您可以将其用作模块 - 如果您在函数中有代码 - 即。

import videogenfull

def output_view(requests):
    filename = videogenfull.some_function()
    return HttpResponse(f'<h1>Hello World</h1><video src="{filename}"/>')

【讨论】:

  • 效果很好,谢谢!现在我将了解如何在函数output() 中使用videogenfull.py。我认为 subprocess 最适合我,但我尝试了上述方法,但没有成功。
  • 与子进程可能使用 ["/full/path/to/python", "/full/path/to/videogenfull.py"] 。两个版本都只运行您的脚本,但之后它不知道下载视频的完整路径是什么以及在 HTML &lt;video src=.../&gt; 中使用什么 - 类似于 &lt;video src="/static/video.mp4" /&gt;
  • 我刚刚再次尝试了第一个子流程解释,它成功了!在“子进程”出现拼写错误“suprocess”之前,我应该已经注意到了。我还需要安装videogenfull.py 在我的 django 虚拟环境中使用的一些模块。感谢所有的努力。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2023-04-09
  • 2017-06-20
相关资源
最近更新 更多