Skip to content

aghio-2020/image-processing-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Image Processing

This is a RESTful API able to upload and apply effects to images using Django Rest Framework that has

  • Docker to run all the needed services
  • Uses Cloudflare R2 with boto3 to store images
  • Celery to perform transforms on the background as tasks, without blocking the app
  • Redis as Celery broker and results backend, as well as application cache store for recent data.
  • JWT for authentication
  • Unit tests

The images are private to the users and retrieving image details returns a temporary URL that grants access for a period of time.

Set Up

to be able to use this repo you should first get a Cloudflare R2 account and create a bucket for storing the images. From there you should get the necesary keys to store in an .env file:

    R2_STORAGE_URI=`<your-account-url>`
    R2_ACCOUNT_ID=`<your-account-id>`
    R2_BUCKET_NAME=`<bucket-name>`
    R2_API_TOKEN=`<your-api-token>`
    
    AWS_SECRET_ACCESS_KEY=`<secret-access-key>`
    AWS_ACCESS_KEY_ID=`<secret-key-id>`

you'll need also your postgres credentials

    POSTGRES_DB=`<your-db-name>`
    POSTGRES_USER=`<your-user-name>`
    POSTGRES_PASSWORD=`<your-password>`

a Django secret key

    SECRET_KEY=`<secret>`

and the Redis urls needed for Celery and the in memory cache

    REDIS_CACHE_URL='redis://redis:6379/1'
    
    CELERY_BROKER='redis://redis:6379/0'

Then run from the projects root:

    pipenv install --system

    docker compose up -d --build

    docker compose exec web python manage.py migrate

Usage

Auth

POST hostname:port/api/v1/accounts/register

body: {
  'password',
  'username',
  'email'
}

response: {
  'refresh',
  'access'
}
POST hostname:port/api/v1/accounts/token

body: {
  'password',
  'username',
}

response: {
  'refresh',
  'access'
}
POST hostname:port/api/v1/accounts/token/refresh

body: {
  'password',
  'username',
}

response: {
  'access'
}
POST hostname:port/api/v1/accounts/logout

headers: {
  'Authorization': 'Bearer <accesstoken>'
}

Upload image

POST hostname:port/api/v1/images

headers: {
  'Authorization': 'Bearer: <access-token>'
}

form-data: {
  'image': '<filepath>'
}

Image Detail

specified by UUID which is the image id

GET hostname:port/api/v1/images/<uuid>

headers: {
  'Authorization': 'Bearer: <access-token>'
}

response: {
  'id'
  'file_key', # internal R2 key
  'user_id',
  'created_at',
  'url',
}

Images List

returns a list of paginated image details that the user owns. Query params will fall back to defaults if missing or invalid

GET hostname:port/api/v1/images

query_params: {
  'pages', #optional
  'page_size', #optional
  'limit' #optional
}

headers: {
  'Authorization': 'Bearer: <access-token>'
}

the response is a json array with all the pages with the image details, each image has a access url to be able to use it for a period of time

Delete Image

DELETE hostname:port/api/v1/images/<uuid>

headers: {
  'Authorization': 'Bearer: <access-token>'
}

Image Transform

apply transforms to image and receive the image details as response, all the listed effects are optional, only a one is needed to work

PUT hostname:port/api/v1/images/<uuid>/transform

headers: {
  'Authorization': 'Bearer: <access-token>'
}

body: {
  resize: {
    width,
    height
  }
  crop: {
    width,
    height,
    x, 
    y
  }
  rotate: Float
  flip: Char # either lr (left-right) or tb (top-bottom)
  filters: {
    sepia,
    grayscale
  }
}

response: {
  task_id
}

this will create a background task that you can poll using task_id

GET hostname:port/api/v1/images/tasks/<task_id>

headers: {
  'Authorization': 'Bearer: <access-token>'
}

response: {
  task_id,
  status,
  # if finished
  result: {
    success, 
    error,
    data
  }

}

Tests

with docker container running execute:

docker compose exec web python manage.py test

pytest -m api/v1/images/tests/test_effects.py

https://roadmap.sh/projects/image-processing-service

About

Django REST API for storing images and doing transformations on them. Using Cloudflare R2, Docker, Redis and Celery

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors