标新取异项目

video

数据库设计(暂行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Course(models.Model):
"""课程类"""
title = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.title


class Lesson(models.Model):
"""课程中的单节课类"""
course = models.ForeignKey(Course, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
video = models.FileField(upload_to='lessons/')
sequence = models.PositiveIntegerField() # 正整数,课程中课的顺序

class Meta:
ordering = ['sequence']

def __str__(self):
return self.title

在这个设计中,我们新增了一个名为 sequence 的正整数字段来表示课程中每一节课的顺序。我们还在 Meta 类中使用 ordering 属性对 Lesson 模型的查询结果进行排序,以保证按照顺序返回课程。

当你创建新的 Lesson 对象时,请确保为 sequence 字段赋予适当的值,以确保课程的顺序是正确的。你可以使用合适的逻辑来管理和维护 sequence 字段的值。

通过这种方式,你可以在检索特定课程的所有课程时,按照顺序返回课程对象列表。

1
2
python manage.py makemigrations  
python manage.py migrate

界面设计

一、iframe配置问题

要解决在 Django 项目中设置 ‘X-Frame-Options’ 导致的错误,你可以按照以下步骤进行配置:

  1. 在你的 Django 项目的设置文件(settings.py)中找到 MIDDLEWARE 配置选项。它包含了一个中间件类列表,这些中间件按照顺序在请求和响应之间进行处理。
  2. 确保以下三个中间件类在 MIDDLEWARE 列表中存在,并且按照相应的顺序排列:
1
2
3
4
5
6
MIDDLEWARE = [
# ...
'django.middleware.security.SecurityMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# ...
]

SecurityMiddlewareXFrameOptionsMiddleware 是 Django 提供的中间件,用于处理安全相关的功能和 X-Frame-Options 设置。

  1. 检查 X_FRAME_OPTIONS 设置是否存在,并确保其值为 'SAMEORIGIN'。在你的 settings.py 文件中添加或修改以下代码:
1
X_FRAME_OPTIONS = 'SAMEORIGIN'

这将确保 Django 在响应头中设置 X-Frame-Options'SAMEORIGIN',允许该网站在相同的 origin 下被嵌入到 <iframe> 中。

  1. 保存并重启你的 Django 项目,然后再次尝试访问网站,看看是否仍然出现相同的错误。

如果你依然遇到问题,确保你已经正确地配置了以上步骤,并检查 Django 版本是否支持该配置项。

请注意,修改 X_FRAME_OPTIONS 设置可能会影响网站的安全性,因此在修改设置之前,请确保你了解该设置可能带来的潜在风险,并根据具体情况进行设置。

二、viedo时间

要获取一个视频的时间,你可以使用Python中的第三方库moviepy

首先,确保你已经安装了moviepy库。你可以使用以下命令来安装它:

1
pip install moviepy

接下来,可以使用以下代码来获取视频的时间:

1
2
3
4
5
6
7
8
9
10
11
from moviepy.editor import VideoFileClip

def get_video_duration(file_path):
video = VideoFileClip(file_path)
duration = video.duration
return duration

# 指定视频文件路径,并调用函数获取时间
file_path = "path/to/your/video.mp4" # 替换为你的视频文件路径
duration = get_video_duration(file_path)
print("视频时长:", duration, "秒")

在代码中,我们定义了一个名为get_video_duration的函数来获取视频的时长。该函数接受视频文件的路径,并使用VideoFileClip类加载视频。然后,我们可以使用duration属性来获取视频的时长(以秒为单位)。

请注意,代码中需要替换file_path变量的值为你要获取时间的视频的实际路径。另外,moviepy库还提供了其他功能,比如剪辑视频、提取音频等操作,你可以根据需要进行进一步的学习和使用。

要根据视频的时长将其格式化为不同的时间显示格式,你可以使用Python中的datetime模块来实现。

以下是一个示例代码,根据视频的时长将其格式化为不同的时间显示格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import datetime
from moviepy.editor import VideoFileClip

def format_duration(duration):
if duration < 3600: # 小于一小时
time_format = "%M:%S"
else: # 大于一小时
time_format = "%H:%M:%S"

formatted_duration = str(datetime.timedelta(seconds=duration))
formatted_duration = datetime.datetime.strptime(formatted_duration, "%H:%M:%S").time().strftime(time_format)
return formatted_duration

# 指定视频文件路径,并调用函数获取时间并格式化
file_path = "path/to/your/video.mp4" # 替换为你的视频文件路径
video = VideoFileClip(file_path)
duration = video.duration
formatted_duration = format_duration(duration)
print("视频时长:", formatted_duration)

在代码中,我们定义了一个名为format_duration的函数。如果视频的时长小于3600秒(即一小时),我们使用"%M:%S"格式(分钟:秒)来格式化时间。否则,我们使用"%H:%M:%S"格式(小时:分钟:秒)。然后,我们将视频时长转换为datetime.timedelta对象,并使用strptimestrftime方法来将其格式化。

同样,请注意替换file_path变量的值为你要获取时间的视频的实际路径。

这样,无论视频的时长是小于一小时还是大于一小时,输出的时间格式将相应地进行格式化。

##数据库修改##

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
from datetime import timedelta
from moviepy.editor import VideoFileClip

class Lesson(models.Model):
"""课程中的单节课类"""
course = models.ForeignKey(Course, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
video = models.FileField(upload_to='lessons/')
seenum = models.IntegerField(default=0)
sequence = models.PositiveIntegerField() # 正整数,课程中课的顺序
duration = models.DurationField(null=True, blank=True) # 视频时长

@receiver(pre_save, sender=Lesson)
def calculate_duration(sender, instance, **kwargs):
if instance.video:
# 使用moviepy获取视频时长
video_path = instance.video.path
clip = VideoFileClip(video_path)
duration = clip.duration
clip.close()

# 转换为timedelta对象并赋值给duration字段
instance.duration = timedelta(seconds=duration)

pre_save.connect(calculate_duration, sender=Lesson)

标新取异项目
https://ajieio.github.io/2023/08/20/bz1/
作者
阿杰
发布于
2023年8月20日
许可协议