首页 > 解决方案 > 向用户显示相关文件 - Django

问题描述

我正在尝试构建一个 Web 应用程序,该应用程序在浏览器中单击按钮时以编程方式创建一个视频,并在创建后在同一个浏览器中为用户显示它。

到目前为止,我已经连接了一个脚本,该脚本可以在触发按钮时制作视频并且可以正常工作。我还有一个模型,其中相同的脚本上传和存储创建的视频,并且也可以。

现在我被困试图向创建它的用户显示相关视频,即点击按钮。我该怎么做呢?我应该使用什么方法?我不确定如何进行。

在下面的示例中,我能够显示 id=16 的视频。我该如何调整它以便浏览器显示相关视频而不是与 id=16 关联的视频?

.html

{% load static %}

<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <video width="320" height="240" controls>
      <source src= "{{ MEDIA_URL }}{{ object.videofile }}" type='video/mp4'>
    </video>
    <p></p>


<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>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js">
</script>


 </body>
</html>
models.py

from django.db import models

class VideoUpload(models.Model):
    name= models.CharField(max_length=500)
    videofile= models.FileField(upload_to='videos/', null=True)
views.py

def video_upload_detail_page(request):
    obj = VideoUpload.objects.get(id=16)
    template_name = 'video_upload_detail.html'
    context = {"object": obj}
    return render(request, template_name, context)

标签: pythondjangovideo-streaming

解决方案


首先在您的视频模型中,您需要一个外键,或者我认为用户模型的 m2m 字段。以便保存用户和他/她的视频之间的关系。然后在模板中,当用户按下按钮保存视频时,您已经可以使用 request.user 访问用户,并且如果用户已通过身份验证,或者甚至对于用户(会话)ip,则将该 ip 或用户 ID 保存到视频模型的相应字段。可能需要使用 AJAX 将 ip 或 id 发送到后端。*注意:如果您希望匿名用户能够保存他们的视频 m2m 字段必须更改为 char 字段才能将 ip 保存为字符串

<input id="id_holder" type="hidden" value="{{ request.user.id }}"  >
<script>
  $("#myClickButton").click(function() {
   // catch and send user id to use in get request
   // in javascript using mines between string and int  will convert string to int ;)
   $.get(`/output/${$("#id_holder").val() - 0}`, function(data) {
      $("#myOutput").html(data);
    }, "html");
  });
</script>

#urls.py
url_patterns =[
 ......
  path('output/<int:user_id>' , views.output, name="output"),
 ......

请注意,也可以使用第三种模型来链接 USER 和 Video 模型关系。

更新

  • 我不确定这是否安全或好主意?!但它仍然有效

首先,您需要捕获用户 IP,可能使用如下函数:

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

然后在 Video 模型中,您有一个 models.char-field 来存储该 IP,然后任何时候该 IP 访问该页面,您都可以像这样访问相关的 Video 实例:

video_instance = get_object_or_404(VideoModel, ip=str(get_client_ip(request))

推荐阅读