A Django-based portfolio website showcasing the sculpture, jewelry, puzzles, and chairs of artist Charles O. Perry. This site has been modernized to Django 5.x with a file-based data architecture.
- Sculpture Gallery: Browse sculptures by style (ribbed, planar, topological, solid) or material
- Jewelry Collection: View pendants, earrings, pins, and other jewelry pieces
- Puzzle Showcase: Interactive puzzles and chess sets
- Chair Designs: Industrial design furniture pieces
- Contact Forms: Contact and newsletter subscription functionality
- Tour & Slideshow: Interactive map tour and slideshow presentations
- Framework: Django 5.x
- Data Storage: File-based CSV data (no database required)
- Authentication: None (public portfolio site)
- Email: Django SMTP integration for contact forms
- Python 3.8+
- pip
- Clone the repository:
git clone <repository-url>
cd charlesperrycom- Install dependencies:
pip install django- Set up environment variables (optional):
cp .env.example .env
# Edit .env with your values- Run the development server:
python manage.py runserver- Visit the site:
- Main site: http://localhost:8000/
Create a .env file or set environment variables:
# Required for production
DJANGO_SECRET_KEY=your-secret-key-here
DEBUG=false
# Email configuration (for contact forms)
[email protected]
EMAIL_HOST_PASSWORD=your-app-password
[email protected]See EMAIL_SETUP.md for detailed email configuration instructions.
The site uses CSV files for data storage:
media/sculpture/art.csv- Sculpture databasemedia/jewelry/jewelry.csv- Jewelry collectionmedia/puzzles/puzzles.csv- Puzzle designs
To add new sculptures, jewelry, or puzzles:
- Add a new row to the appropriate CSV file
- Add images to the corresponding media directory
- The changes will appear immediately (no database migration needed)
/- Homepage/sculpture/- Main sculpture gallery/sculpture/style/- Browse by style/sculpture/material/- Browse by material/sculpture/slideshow/- Slideshow presentation/sculpture/tour/- Interactive map tour/jewelry/- Jewelry collection/puzzles/- Puzzle designs/chairs/- Chair furniture/bio/- About the artist/bio/contact/- Contact form
# Start development server
python manage.py runserver
# View emails in console (no SMTP needed)
# Contact forms will print to terminalThe site uses CSV files instead of a traditional database:
- Benefits: No database setup, easy data management, version controllable
- Data Loading: CSV files are read on each request
- Performance: Suitable for small datasets (hundreds of items)
- Legacy Models: Django model files (
models.py) are preserved but not used. They could be reactivated for future database integration if needed.
- New Data Types: Add CSV file and create corresponding item class
- New Views: Follow existing patterns in app views.py files
- Templates: Extend base templates for consistent styling
- Generate new
DJANGO_SECRET_KEY - Set
DEBUG=false - Configure email settings
- Set up web server (nginx/Apache) for static files
- Configure HTTPS
- Set proper file permissions
export DJANGO_SECRET_KEY="your-generated-secret-key"
export DEBUG=false
export EMAIL_HOST_USER="[email protected]"
export EMAIL_HOST_PASSWORD="app-specific-password"
export DEFAULT_FROM_EMAIL="[email protected]"This site was migrated from Google App Engine to modern Django:
- Original: GAE Python 2.7 with webapp2 framework
- Converted: Django 5.x with Python 3.8+
- Database: Migrated from GAE Datastore to CSV files
- Authentication: Removed (was admin-only, now public)
- Email: Converted from GAE Mail API to Django SMTP
- Secret key moved to environment variables
- Debug mode configurable
- No user authentication (reduced attack surface)
- File-based data (no SQL injection risk)
- Minimal dependencies
- Proper email configuration
- Data Loading: CSV files loaded on each request
- Caching: None implemented (suitable for low-traffic portfolio site)
- Static Files: Served by Django in development, should use web server in production
- Modern browsers (Chrome, Firefox, Safari, Edge)
- Mobile responsive design
© 2000-2025 Charles O. Perry. All rights reserved.
For technical issues or questions about the artist's work, use the contact form at /bio/contact/.