我正在研究一个向用户显示HTML视频的web应用程序,这些视频的来源是对flask服务器的get请求,如果用户被正确验证,将返回正确的视频。代码如下:
HTML:
<video id="movie" width="100%" controls autoplay>
<source src="/flask/server/video?title=xxxxxx.mp4" type="video/mp4">
</video>
瓶:
@app.route('/flask/server/video')
def return_video():
if jwtVerify(request.cookies): # used for authenication
filename = request.args.get('title')
find_the_actually_video_file_location() # not in the static or public_html dir
file = realLocation + str(filename)
return send_file(file)
else:
return redirect(url_for("login"))
使用这种方法意味着视频文件的真实目录不暴露给用户,必须完成身份验证,并且视频不需要在public_html或static文件夹中。
但是,与使用
相比,这会导致显著的缓冲(特别是在擦洗时):<video id="movie" width="100%" controls autoplay>
<source src="/static/real/movie/dir/xxxxxx.mp4"type="video/mp4">
</video>
我不想使用,因为如果有人可以获得文件的确切URL并且文件必须在static或public_html目录中,则不需要身份验证。
我如何加快第一个方法,使它不缓冲,或者使第二个方法只能访问那些认证?
Apache2 + Flask + Jinja在Ubuntu Server 20.04.
谢谢!
使用Nginx你会使用X-accel
这允许您处理身份验证,日志记录或任何您想要的请在你的后端,然后有NGINX处理服务的内容从重定向位置到最终用户,从而释放后端处理其他请求。这个特性通常被称为X-Sendfile .
我认为Apache也有类似的。
你的代码看起来像这样:
@app.route('/flask/server/video')
def return_video():
if not jwtVerify(request.cookies): # used for authenication
return redirect(url_for("login"))
# Autheticated OK
# real file location
_file = "/var/www/files/my-big-document.pdf"
_size = os.path.getsize(file)
# File URI - see Nginx docs
_uri = "/protected_files/my-big-document.pdf"
response = make_response()
response.headers['Content-Description'] = 'File Transfer'
response.headers['Cache-Control'] = 'no-cache'
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Length'] = _size
response.headers['X-Accel-Redirect'] = _uri
return response