如何修复Jinja模板:TypeError:“视频”对象不可编辑?

2024-04-20 03:44:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个web应用程序,我应该返回用户上传的视频,以及基于视频的预测结果。当我这样做时,我得到以下错误。它有时确实会工作,有时会抛出这个错误。如果我自己运行acp.py文件,我会得到一个错误,说不能追加str。但是我要在dict中追加一个列表?查看我的代码时,请特别注意******下的代码

我的错误是:

ERROR: Exception on /cv/action_prediction/I3D_VID [POST] Traceback (most recent call last): File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\app.py", line 2070, in wsgi_app response = self.full_dispatch_request() File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\app.py", line 1515, in full_dispatch_request rv = self.handle_user_exception(e) File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\app.py", line 1513, in full_dispatch_request rv = self.dispatch_request() File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\app.py", line 1499, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) File "D:/Anaconda/envs/DEMO/Visionet_ML_Project/main.py", line 311, in cv_acp_vid_I3D_upload_video return render_template('cv_acp_vid_I3D.html', filename=filename, results=results) File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\templating.py", line 150, in render_template ctx.app, File "D:\Anaconda\envs\DEMO\lib\site-packages\flask\templating.py", line 128, in render rv = template.render(context) File "D:\Anaconda\envs\DEMO\lib\site-packages\jinja2\environment.py", line 1304, in render self.environment.handle_exception() File "D:\Anaconda\envs\DEMO\lib\site-packages\jinja2\environment.py", line 925, in handle_exception raise rewrite_traceback_stack(source=source) File "D:\Anaconda\envs\DEMO\Visionet_ML_Project\templates\cv_acp_vid_I3D.html", line 117, in top-level template code {% for result in results%} TypeError: 'Video' object is not iterable shooting_basketball - 54.23 playing_basketball - 16.33 playing_volleyball - 12.27 passing_American_football-not_in_game- - 3.64 dodgeball - 2.94 127.0.0.1 - - [06/Oct/2021 14:49:28] "POST /cv/action_prediction/I3D_VID HTTP/1.1" 500 -

main.py

        results = cv_acp.I3D_VID(path)
        #print('upload_video filename: ' + filename)
        flash('Video successfully uploaded and displayed below')
        return render_template('cv_acp_vid_I3D.html', filename=filename, results=results)

@app.route('/cv/action_prediction/I3D_VID/display/<filename>')
def cv_acp_vid_I3D_display_video(filename):
    #print('display_video filename: ' + filename)
    return redirect(url_for('static', filename='uploads/' + filename), code=301)

cv_acp.py

def I3D_VID(vid):
    print('The input video frame is classified to be')
    ****results=[]
    for i in range(topK):
       # result=('\t%s - %.2f'%(classes[ind[i].asscalar()], nd.softmax(pred)[0][ind[i]].asscalar()*100))
        datadict = {
          #   'header': 
             'data': ('\t%s - %.2f'%(classes[ind[i].asscalar()], nd.softmax(pred)[0][ind[i]].asscalar()*100))
        }  
        results.append(datadict)
    #print (results)
    return results****

cv_acp_vid_i3D.html

     <div id="content" class="p-4 p-md-5 pt-5">

        <h2 class="mb-4">TSN PIC</h2>
        <!Doctype html>
<title>Python Flask File Upload Example</title>
<h2>Select a file to upload</h2>
<p>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
</p>
{% if filename %}
    <div>
    <table border=1>
{% for result in results%}
    <tr>
      <td>
        {{result.data}}
      </td> 
    </tr>
{% endfor %}

    </table>
        <div style="margin: 10px auto;">
        <video autoplay="autoplay" controls="controls" preload="preload">
            <source src="{{ url_for('cv_acp_vid_I3D_display_video', filename=filename) }}" type="video/mp4"></source>
        </video>
    </div>
        
    </div>
    

    
{% endif %}
<form method="post","get" action="/cv/action_prediction/I3D_VID" enctype="multipart/form-data">
    <dl>
        <p>
            <input type="file" name="file" autocomplete="off" required>
        </p>
    </dl>
    <p>
        <input type="submit" value="Submit">
    </p>
</form>
      </div>
        </div>