在views.py Django中1函数中的多个渲染

时间:2019-05-15 09:53:20

标签: python django django-templates django-views

我对Django非常陌生... 我想使用提交按钮在后台运行python文件并在下一页显示内容... 但是我的python文件需要一些时间才能取出结果,因此在两者之间,我想在两者之间放置一个正在加载的html页面。...

我写了一些可以正确运行python文件的代码,但是我无法在两者之间合并加载页面... 看看我在views.py

中的功能
def submit(request):
    info = request.POST['info']
    print('value is ', info)
    filename = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    result = run(['python', filename, info], stdout= PIPE )
    return render_to_response("loading.html")
    run(['python', filename, info], stdout= PIPE )
    return render(request, 'python_output.html', context)

实际结果: 返回render_to_response(“ loading.html”) 可以,但是控件不会转移到运行命令... 我想运行正在加载的html页面,并在后台运行python文件,当python文件运行完成时,应移至显示输出的python _output.html页面...

预期: 加载页面应该可以正常工作,然后该控件应转到运行命令,然后应该转到python_output.html页面... /

4 个答案:

答案 0 :(得分:1)

return语句将终止该函数的执行,因此其下的任何内容均将无法获得。

您可以使用Javascript显示加载图标,然后使用JQuery在后台运行GET请求,并在其中调用Django的自定义视图,该视图将输出命令的结果。收到数据后,您可以删除图标并根据需要处理数据。

基本示例:

Django
------

    url(r'^command/', views.command, name='command'),

    def command(request):
        info = request.POST['info']
        filename = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        result = run(['python', filename, info], stdout= PIPE
        return result

Javascript
----------

    <img id="loading-icon" src="loading.gif">

    $.get("/command", function(text)
    {
        $("#loading-icon").remove();
        process(text);
    });

答案 1 :(得分:0)

您需要了解Django中的基本流程

enter image description here

您只能在视图中添加一个退货。执行完第一个返回后,它会转到响应中间件,因此下面的所有其他返回都将被忽略。可以在前端的javascript中完成加载

答案 2 :(得分:0)

尝试在加载第一页(loading.html)时使用ajax请求在后台运行python文件,并在完成后通过output.html显示结果。

使用JQuery,必须在模板文件中调用如下函数:

Option Explicit
Sub SearchForString()
 Dim a As Long, arr As Variant, fnd As Range, cpy As Range, addr As 
 String
 On Error GoTo Err_Execute
  'populate the array for the outer loop
  arr = Array("trigger")
  With Worksheets("test")
   'outer loop through the array
   For a = LBound(arr) To UBound(arr)
       'locate first instance
       Set fnd = .Columns("A").Find(what:=arr(a), LookIn:=xlFormulas, LookAt:=xlPart, _
                                    SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                                    MatchCase:=False, SearchFormat:=False)
       If Not fnd Is Nothing Then
          'record address of first find
           addr = fnd.Address
           'seed the cpy range object
           If cpy Is Nothing Then Set cpy = fnd.EntireRow
           Do
               'build union
               Set cpy = Union(cpy, fnd.EntireRow)
               'look for another
               Set fnd = .Columns("A").FindNext(after:=fnd)
           'keep finding new matches until it loops back to the first
           Loop Until fnd.Address = addr
       End If
   Next a
  End With
    With Worksheets("test")
    'one stop copy & paste operation
   cpy.Copy Destination:=.Cells(.Rows.Count, "c").End(xlUp).Offset(1, 0)
 End With

  MsgBox "All matching data has been copied."

  Exit Sub
 End Sub

希望我能理解你的问题。

答案 3 :(得分:0)

您想要的工作比预期的要多:

  • 安装诸如celery的后台任务框架(以及诸如Redis或RabbitMQ的队列以存储任务),该框架将从队列中提取任务并进行处理。
  • 您的初始视图需要启动后台任务。
  • 您要跟踪此任务的task_id,方法是在对用户的响应中返回它,或者将其保存在用户会话中。您的视图以HTML页面作为响应,显示“请耐心等待...”和javascript处理下面的内容(见下文)。
  • 然后,您需要一个可以检查任务状态的视图(基于查询中传递的task_id或当前会话中保存的task_id)。它使用任务结果返回“状态=处理中...”或“状态=完成”,以JSON响应。
  • 在HTML页面中,您需要Javascript定期查询该视图,直到状态为“完成”,然后处理任务结果以更新页面的HTML。

搜索“ django芹菜教程”,您会发现很多示例。