Solve media file streaming issue with Python Flask

This is how to solve mobile file streaming issue with Python Flask.

If you serve video file with Python Flask, Flask serve the media file with 206 Partial Content, but Connection is set to Close. If you want to serve media file like streaming service, Python Flask cannot serve to iOS or Android media file like streaming.

On iOS or Android phone, browser said can not play this media file like this image.

To solve this problem, you should serve media file with Connection: Keep-Alive.

But Python Flask does not support this feature.

So Here is a solution.
It needs Nginx and Gunicorn.
Nginx will serve the media file, but it will prevent to access from not authorized access using “internal” function in Nginx.
“internal” function allows you to accept traffic only from the Python Flask code(not direct access).

The media file serving flow
User -> Nginx -> Gunicorn -> Authentication check and redirect to serve media file -> Response Media Data from Nginx

Nginx Config

server {
listen 80;
server_name yourserver.com;

location /download_file/ {
internal; # Receive only internal redirect
alias /file/path/in/your/server/;
}

# For Gunicorn Serving Gateway
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

if (!-f $request_filename) {
proxy_pass http://localhost:12345;
break;
}
}
}

Python Code

@app.route('/download/')
def download(filename):
if not authentication():
abort(404)

redirect_path = '/download_file/' + filename

response = make_response("")
response.headers["X-Accel-Redirect"] = redirect_path
response.headers["Content-Type"] = mimetypes.guess_type(filename)
return response

Then iOS and Android browser can play the media file served from your server.

Reference :
1. http://stackoverflow.com/questions/19421014/error-occurred-in-mobile-when-send-video-using-send-file-in-python-flask
2. http://mattspitz.me/2013/11/20/serving-authenticated-media-with-nginx.html

티스토리에서 워드프레스로 이전하기

티스토리가 2016년 12월 부터는 백업기능의 지원을 중단하여 블로그 백업을 할 수 없게 되었습니다.
저 또한 워드프레스로 블로그를 이전하면서 이 영향을 받았는데요, 기존에 받아놓은 백업파일이 전혀 없어 다른 방법을 찾아야 했습니다.
Github 나 Gist 를 검색을 해보아도 아직까지 다른 방법을 올려놓은 분들이 계시지 않아 직접 만들게 되었습니다.
아마 다른 방법을 찾을수 있는 분들은 이미 워드프레스로 옮기셨거나 블로그를 접으신것 같습니다.

티스토리에서 워드프레스로 블로그를 이전하는 방법은 Github Gist 에 작성해서 올려놓았습니다.
아래 주소에서 확인하실수 있습니다.

다만 개발에 대한 지식이 없으시면 진행하기 많이 힘듭니다.
Python 과 SQL 과 웹서버에 대한 이해가 필요합니다.

https://gist.github.com/taylor224/5eef306afaef7a7a136c66daecba6e41

본 글에 대한 별도의 문의는 받지 않습니다.