python - 向用户显示相关文件 - 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)
解决方案
首先在您的视频模型中,您需要一个外键,或者我认为用户模型的 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))
推荐阅读
- python - youtube-dl 完成下载时运行异步函数(python)
- amazon-web-services - 是否可以通过服务器发送事件使用 AWS S3 存储的电子邮件?
- javascript - 在图片加载之前预加载 JS 计算
- node.js - 使用 node.js 和 Express 时,为什么额外的 / 在地址中会中断链接到图像而不是 html 文件?
- sql - 在 dbgrid 中的子选择 SQL 查询列上写入值
- erlang - 如何更改/设置 :mnesia 长生不老药中的文件夹?
- angular - 如何为迁移的域设置角度构建路径?
- javascript - 使用 AM 排序日期和时间 | jQuery中的PM
- amazon-web-services - 如何在 AWS 中为两个 CloudFront 设置 Canary Release?
- c# - 查找下一个日历年第 13 天的星期五