Start learning free

LESSON 117 OF 188 · BACKEND: PAYMENTS AND OTHER SERVICES

Serve the Photo in Python

Practice

A page shows a product's photo with a tag like <img src="/products/1/photo">. The browser sends a GET to that address and draws whatever image comes back. So the shop answers the photo's bytes as they are, not JSON.

Bytes don't say what they are. The answer's Content-Type header tells the browser how to read them: image/png, image/jpeg... jsonify always sets it to application/json; for bytes, you set it yourself. A Flask function can return three values: the body, the status and a dictionary of headers. For example, a route that answers plain text:

@app.get("/robots.txt")
def robots():
    return "User-agent: *", 200, {"Content-Type": "text/plain"}

The module mimetypes knows the type of each file extension. mimetypes.guess_type("report.pdf") gives two values, the type and an encoding: ('application/pdf', None). Take the type with [0].

After the tests upload two photos, the shop must answer:

POST /products/1/photo  (photo: mug.png, 16 bytes)  →  201  {"filename": "mug.png", "product_id": 1, "size": 16}
POST /products/3/photo  (photo: lamp.jpg, 17 bytes)  →  201  {"filename": "lamp.jpg", "product_id": 3, "size": 17}
GET /products/1/photo  →  200  Content-Type: image/png, the 16 bytes
GET /products/3/photo  →  200  Content-Type: image/jpeg, the 17 bytes
GET /products/2/photo  →  404  {"error": "This product has no photo"}

Your task: add GET /products/<id>/photo. Look up the product's row in photos; with no row, answer 404; otherwise answer the stored bytes with status 200 and the Content-Type for the photo's file name.


Assignment
Follow the Coding Tutorial to add the route that serves a product's photo.


Hint
mimetypes is already imported. guess_type gives a pair, so take [0]. The return has three values: the bytes, 200 and a dictionary with "Content-Type".


STEP 1 OF 7
    Ctrl + Enter to check

    Files Serve in Python

    Keep going with Python1,600+ step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free