【问题标题】:Display relevant file to user - Django向用户显示相关文件 - Django
【发布时间】:2020-06-14 14:52:18
【问题描述】:

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

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

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

在下面的示例中,我能够显示 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)

【问题讨论】:

    标签: python django video-streaming


    【解决方案1】:

    首先在您的视频模型中,您需要一个外键,或者我认为用户模型的 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))
    

    【讨论】:

    • 谢谢你。我是新手,其中一些概念对我来说非常先进。我将花一些时间对您的方法进行反向工程。但是,出于兴趣,对于初学者来说,是否有一种不太先进的方法可以做到这一点。我希望我能以某种方式在没有 AJAX 的情况下从数据库中获取 id?
    • 您将从 {{ request.user.id }} 获取 id,然后将其传递给后端以将其保存在数据库中以用于视频模型实例。
    • 在 models.py 中我添加了 user = models.ForeignKey(User, blank = True, null = True, on_delete=models.CASCADE) 和 views.py 我添加了 user = request.user obj = VideoUpload.objects.get(id=user_id) 并且我收到错误 - 名称 'user_id' 未定义。会继续努力。
    • 是的,但是你必须像这样定义views.py的函数:def output(request, user_id=None)
    • 所以,user_id 在这种情况下不起作用。相反,您应该使用他们的 IP 地址为自己保存视频
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多