This tutorial will guide you through building the video server present in the examples/video directory. This is a very simple app that responds conditionally to the requests i.e. it will allow the HTML video tag to work correctly.
examples/video
To run the example, in examples/video the following should start the server, (see Installation first),
$ export QUART_APP=video:app $ quart run
the video is then available at http://localhost:5000/. Note you will need to place a video file called video.mp4 alongside the video.py file for this to work.
video.mp4
video.py
Quart by default expects the code to be structured in a certain way in order for templates and static file to be found. This means that you should structure the video app as follows,
video/ video/templates/ video/video.mp4
doing so will also make your project familiar to others, as you follow the same convention.
It is always best to run python projects with a pipenv, which should be created and activated as follows,
$ cd video $ pipenv install quart
for this video we will only need Quart. Now pipenv can be activated,
$ pipenv shell
Conditional responses allow the server to send only the data that the client has requested. The client indicates this by attaching a Range header to the request, which can be retreived manually via,
Range
range = request.range range.units # Usually bytes range.ranges # List of requests ranges
as hinted this is quite common for videos, given the large size.
A server doesn’t have to respond conditionally, and can in fact always send the entire file. As it is optional you have to choose to use it, via the make_conditional() method. Like so,
make_conditional()
response = await send_file(...) # Or any response await response.make_conditional(request.range)
as a client you can tell the difference via the status code, 200 is the full response and 206 a partial response.
The example files contain this entire tutorial and a little more, so they are now worth a read. Hopefully you can now go ahead and create and serve videos or any other file conditionally.