Tutorial: Video

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.

Running the example

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.

1: Structure

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,


doing so will also make your project familiar to others, as you follow the same convention.

2: Installation

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

3: Conditional Responses

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 retrieved manually via,

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,

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.

4: Conclusion

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.