As part of a previous post I wrote about using PyTinyDNS to dynamically assign DNS subdomains with updated IP addresses every time a user connects. Another service that we were missing was a simple image sharing site for use exclusively on the VPN. I've been intending to play with Flask for a while now this seemed like a good excuse to dive in.
Flask is a microframework for Python based on Werkzeug and Jinja2. This combination of tools allows rapid development of web applications through Jinja's modern extensible template language and Werkzeug's URL routing modules.
If this is your first time playing with flask, go ahead grab virtualenv. Flask will be installed later.
$ sudo pip install virtualenv $
Now grab a copy of Flaskgur and setup the new virtual environment.
$ git clone https://github.com/chokepoint/flaskgur.git $ cd flaskgur $ virtualenv venv $ . venv/bin/activate $ pip install Flask
Flaskgur relies on a small sqlite database with an id field and filename field. The git repository comes with a copy of the database schema.
$ sqlite3 flaskgur.db < schema.sql
Now edit flaskgur.py and point the base directory to your desired location and start Flaskgur.
$ python flaskgur.py * Running on http://0.0.0.0:5000/ * Restarting with reloader
The directories are broken down into the following list.
- pics - Where the uploaded pictures are saved
- static - Static formatting files (css) and custom 404 image
- templates - Jinja2 formatted template files
For simplicity, the custom 404 page doubles as error page for bad file types. base.html is the base template, and data is filled in respectively by upload.html and 404.html thanks to Jinja. I included a simple macro in upload.html as well for a basic example.
This is not a complete product by any means, and I do not profess to be a CSS guru. If you'd like to clean up some of the formatting, pull requests are always welcome. The database could easily be upgraded to include a description of photos or incorporate a ranking system. If you're interested in extending this project, head on over to github and add whatever you feel is necessary.