The document discusses bootstrapping Django projects with ease. It introduces djenesis, a tool created by Concentric Sky to simplify starting new Django projects and setting up existing projects. Djenesis encourages best practices like using virtualenv and standard project structures. It allows importing external templates from Git, Mercurial, or Subversion to version control project templates.
4. (Some) Technologies We Use
⢠Chef ⢠Backbone.js
⢠Jenkins ⢠Jinja2
⢠AWS ⢠Celery
⢠Sphinx ⢠DebugToolbar
⢠Memcached ⢠jQuery / jQueryUI
⢠South ⢠Compass / Sass
⢠git ⢠Mongo & MySQL
Thursday, July 19, 12
5. Released CSky Creations
⢠djenesis â Easy Django Bootstrapping
⢠breakdown - Lightweight jinja2 template
prototyping server
⢠django-cachemodel â Automatic caching
for django models
Thursday, July 19, 12
6. CSky Creations in the Works
⢠skycloud â Tool for AWS auto-scaling
⢠django-skycms â CMS as a library
⢠django-sky-visitor â Invitations, email
conďŹrmation, etc
⢠django-client-admin â Flexible admin for
client
Thursday, July 19, 12
7. CSky Teams
10 Django Team
STAFF
50+
5 Design Team
9 PM Team
3 System Admins
Thursday, July 19, 12
8. Team Interfacing
⢠Each project is a mix from each team
⢠Members might switch amongst projects
⢠Interfaces between teams
⢠Clean separation of handoďŹs and
responsibilities
⢠Best-practices shared within teams
Thursday, July 19, 12
9. âBootstrappingâ
⢠Pulling one up by oneâs bootstraps
⢠Computers do this much better than humans
⢠Django â starting a project, new or existing
Thursday, July 19, 12
10. Bootstrapping with Ease
Making booting (and rebooting) a
django project as easy as possible
⢠Ease is a continually moving target
⢠Shouldnât sacriďŹce other goals for ease (e.g.
security, modularity, be PHP)
Thursday, July 19, 12
11. Moving Targets
Moving targets create new
problems. And new solutions.
⢠CGI â Solving static HTML
⢠JavaScript â Solving non-interactivity
⢠CSS â Solving 100+ HTML pages
⢠Puppet/Chef â Solving 100+ servers
Thursday, July 19, 12
12. Problem/Solution Lifecycle
1. Problem grows
2. Many create their own solution; some
polish; some release
3. Community ďŹocks to one (or a few) solutions
4. Solution(s) gets anointed and others die oďŹ
Thursday, July 19, 12
13. Goals of Easy Bootstrapping
1. More people using Django
2. More people using Django better
Thursday, July 19, 12
14. More People Using Django
⢠As few commands as possible to try
Django out
⢠And to try someone elseâs project out.
⢠Must be highly likely to just work
⢠All especially critical for beginners
⢠Djangoâs runserver & sqlite...great!
⢠It just works...
Thursday, July 19, 12
15. Making Mistakes should be Hard
⢠Checklists are great
⢠The best checklists
are invisible
⢠To automate lists of
commands, must
have consistency
Thursday, July 19, 12
16. Consistency Makes things Easier
⢠Ease of replication across servers
⢠Ease of sharing
⢠Both templates and existing projects
⢠Easier to build upon
Thursday, July 19, 12
17. Consistently Standardized
⢠Standardization: a tool to get to
consistency
⢠This can be in an organization. Or the full
community
⢠Oh yeah, and...
Thursday, July 19, 12
19. Fragmentation
⢠Poor standards lead to fragmentation
⢠Hard to build things on top of
fragmented environments
⢠Imagine building for single browser. Not
Mosaic.
Thursday, July 19, 12
20. Android Fragmentation
http://www.businessinsider.com/android-fragmentation-chart-from-opensignalmaps-2012-5
Thursday, July 19, 12
21. Flexibility vs Standardization
⢠Standardization can be rigid; can kill ďŹexibility
⢠Especially as the target moves
⢠E.g. contrib.auth
⢠Flexibility allows preference, innovation
⢠Best of both worlds is standardization with
structured options of ďŹexibility
⢠Django does this well
Thursday, July 19, 12
22. Django
⢠Django is a set of higher-order building blocks
⢠If blocks are too large, sacriďŹces what can be
made (i.e. not ďŹexibile)
⢠If blocks are too small, becomes ineďŹcient
and unmanageable
⢠If block types are wrong, not loosely
coupled (i.e. non-orthogonal)
Thursday, July 19, 12
23. 3 Stages of Project
Structure Grief
⢠Denial
⢠Bargaining
⢠Acceptance
Thursday, July 19, 12
24. Denial
Iâll just take the
easy way out...
⢠StuďŹ required libraries in a âlibâ directory
⢠Stick django there too
⢠Name everything MyProjectSomething
Thursday, July 19, 12
25. Denial
Iâll just take the easy way out...
Why this doesnât work
⢠project starts to get bloated
⢠version management becomes a headache
⢠upgrade paths become tangled
Thursday, July 19, 12
26. Bargaining
Weâll just adopt some
standard practices...
1. Have the team argue about which way to do things
2. Assign someone to write a document about it
3. ???
4. Ignore it when you start a new project
Thursday, July 19, 12
27. Bargaining
Weâll just adopt some standard practices...
Why this doesnât work
⢠Projects become inconsistent
⢠It is not in source control
⢠No way to manage changes across projects
⢠There is no history of changes or discussion
Thursday, July 19, 12
28. Acceptance
Embrace the community
⢠requirements.txt, version management
⢠also solves the âgit submoduleâ problem
⢠virtualenv is great, always use it
Thursday, July 19, 12
29. Acceptance
No, really, use virtualenv
⢠dependency management
⢠concurrent project management
⢠sand-boxing
⢠solves the âchicken-n-eggâ problem
⢠replication
Thursday, July 19, 12
30. Whatâs in a template?
⢠For a django project, there are two styles:
1. toplevel directory is python code
2. toplevel directory is a website project
Thursday, July 19, 12
31. Toplevel is python code
./manage.py
./my_project/__init__.py
⢠Pros
./my_project/settings.py
./my_project/urls.py
⢠More pythonic; Everything
./my_project/wsgi.py
is python code
Djangoâs default template ⢠It just works
⢠Cons
⢠Everything is python code
⢠Where do non public ďŹles
go?
Thursday, July 19, 12
32. Default Django Project
./manage.py
./my_project/__init__.py
./my_project/settings.py
⢠Where do apps go?
./my_project/urls.py
./my_project/wsgi.py ⢠How about ./my_project/
./my_project/my_app/__init__.py my_app/?
./my_project/my_app/models.py
⢠Name then becomes
âmy_project.my_appâ
⢠What about reusability?
⢠What if I want to rename
my_project?
Thursday, July 19, 12
33. Default Django Project
./manage.py
./my_project/__init__.py
./my_project/settings.py
⢠Where do apps go?
./my_project/urls.py
./my_project/wsgi.py ⢠How about ./my_app/?
⢠Better for reusability, but...
./my_app/__init__.py
./my_app/models.py
⢠Now I have to add ./ to the
PYTHON_PATH
Thursday, July 19, 12
34. Default Django Project
./manage.py
./myapp1/models.py
./myapp1/urls.py
⢠What was the name
./myapp2/models.py again?
⢠Was it âmyapp1â or âmyapp2â
./myapp2/urls.py
./myapp3/models.py
./myapp3/urls.py that contains the main urls
and settings...
Thursday, July 19, 12
35. Toplevel is website project
⢠Pros
./manage.py
./wsgi.py
./requirements.txt
⢠Closer to real world
./apps/mainsite/__init__.py
./apps/mainsite/settings.py
./apps/mainsite/settings_local.py
./apps/mainsite/urls.py environments
./apps/my_app/models.py
⢠Consistency across
./apps/my_app/urls.py
projects
⢠Cons
⢠??? None I guess!
http://github.com/concentricsky/djenesis-template.git
Thursday, July 19, 12
36. Toplevel is website project
./manage.py
./wsgi.py
./requirements.txt
./apps/mainsite/__init__.py
./apps/mainsite/settings.py
./apps/mainsite/settings_local.py.example
./apps/mainsite/urls.py
./apps/my_app/models.py
./apps/my_app/urls.py
Python code is sandboxed
⢠only have to add ./apps to PYTHON_PATH
⢠everything else is ignored by WSGI server
Thursday, July 19, 12
37. Toplevel is website project
./manage.py
./wsgi.py
./requirements.txt
./apps/mainsite/__init__.py
./apps/mainsite/settings.py
./apps/mainsite/settings_local.py.example
./apps/mainsite/urls.py
./apps/my_app/models.py
./apps/my_app/urls.py
Consistent Entry Point Name
⢠I always know where to look ďŹrst: ./apps/
mainsite/urls.py
⢠More important than it may seem at ďŹrst blush
Thursday, July 19, 12
38. Toplevel is website project
./manage.py
./wsgi.py
./requirements.txt
./apps/mainsite/__init__.py
./apps/mainsite/settings.py
./apps/mainsite/settings_local.py.example
./apps/mainsite/urls.py
./apps/my_app/models.py
./apps/my_app/urls.py
settings_local
⢠Loaded after settings.py as overrides.
⢠Easily set up a local development environment.
⢠Production credentials are at no risk.
⢠Easily deploy devel, staging, production stacks.
Thursday, July 19, 12
39. Toplevel is website project
./manage.py
./wsgi.py
./requirements.txt
./apps/mainsite/__init__.py
./apps/mainsite/settings.py
./apps/mainsite/settings_local.py.example
./apps/mainsite/urls.py
./apps/my_app/models.py
./apps/my_app/urls.py
I have requirements.txt
⢠Library dependencies and versioning is simple.
⢠New developers can start working quicker.
⢠Simple virtualenv integration
Thursday, July 19, 12
40. Okay, but now what?
1. Install and use virtualenv
2. Design and use a template
Thursday, July 19, 12
43. Our approach
Djenesis: our solution to the
bootstrapping problem
Thursday, July 19, 12
44. djenesis
⢠What is it?
⢠A tool that facilitates the process of
creating new and setting up existing Django
projects.
⢠Available on github & PyPi (apache license)
⢠github.com/concentricsky/djenesis
Thursday, July 19, 12
45. djenesis - BeneďŹts
⢠SimpliďŹes routine workďŹows for:
⢠Starting a new project
⢠Getting an existing project up and running with ease
⢠Encourages developers to use a standard project
structure and best python practices (virtualenv)
⢠Allows external project templates
⢠Supports git, svn, hg URLs
⢠Supports Django 1.4 project templates
Thursday, July 19, 12
46. djenesis - History
1. Single zip ďŹle of a stub project
2. Script that wrapped stub
3. Decouples templates from script
4. Can use external templates, git URL
5. Now: supports Django 1.4 templates
Thursday, July 19, 12
47. djenesis - External Templates
⢠InďŹating a project from a git/svn/hg source
means you can (and should) version
control your project templates
⢠Collaborate with your internal teams on an
ideal project structure
Thursday, July 19, 12
49. djenesis - Setup
⢠Requires virtualenv
⢠Install virtualenv through pip or easy_install
⢠Install djenesis through pip or easy_install
Thursday, July 19, 12
52. djenesis - ConďŹguration
⢠Use a default template
DJENESIS_DEFAULT_TEMPLATE=/path/to/template
⢠Always use virtualenvwrapper (if installed)
DJENESIS_VIRTUALENVWRAPPER=1
⢠Set these in your .bashrc
Thursday, July 19, 12
53. djenesis â Next?
1. startapp template in project template
2. setup.py Support
3. djenesis post-create hooks for common tasks
(copy local settings, syncdb, import ďŹxtures)
4. Activate virtualenv when djenesis is called
Thursday, July 19, 12
54. Bootstrapping
Django with ease
OSCON 2012
www.concentricsky.com
@concentricsky // biglan / wiggins / bothun
Thursday, July 19, 12