Bootstrapping Django with ease OSCON 2012 www.concentricsky.com - - PowerPoint PPT Presentation

bootstrapping django with ease
SMART_READER_LITE
LIVE PREVIEW

Bootstrapping Django with ease OSCON 2012 www.concentricsky.com - - PowerPoint PPT Presentation

Bootstrapping Django with ease OSCON 2012 www.concentricsky.com @concentricsky // biglan / wiggins / bothun Thursday, July 19, 12 Introductions Mike Biglan Wiggins Josh Bothun CTO Architect Senior Developer @co ffi ndragger Thursday,


slide-1
SLIDE 1

Bootstrapping Django with ease

OSCON 2012 www.concentricsky.com @concentricsky // biglan / wiggins / bothun Thursday, July 19, 12
slide-2
SLIDE 2

Introductions

Mike Biglan

CTO

Wiggins

Architect @coffindragger

Josh Bothun

Senior Developer

Thursday, July 19, 12
slide-3
SLIDE 3

Areas of Concentric Sky

Mobile Enterprise Web/Django

Thursday, July 19, 12
slide-4
SLIDE 4

(Some) Technologies We Use

  • Chef
  • Jenkins
  • AWS
  • Sphinx
  • Memcached
  • South
  • git
  • Backbone.js
  • Jinja2
  • Celery
  • DebugToolbar
  • jQuery / jQueryUI
  • Compass / Sass
  • Mongo & MySQL
Thursday, July 19, 12
slide-5
SLIDE 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
slide-6
SLIDE 6

CSky Creations in the Works

  • skycloud – Tool for AWS auto-scaling
  • django-skycms – CMS as a library
  • django-sky-visitor – Invitations, email

confirmation, etc

  • django-client-admin – Flexible admin for

client

Thursday, July 19, 12
slide-7
SLIDE 7

CSky Teams

STAFF

50+

10 Django Team 5 Design Team 9 PM Team 3 System Admins

Thursday, July 19, 12
slide-8
SLIDE 8

Team Interfacing

  • Each project is a mix from each team
  • Members might switch amongst projects
  • Interfaces between teams
  • Clean separation of handoffs and

responsibilities

  • Best-practices shared within teams
Thursday, July 19, 12
slide-9
SLIDE 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
slide-10
SLIDE 10

Bootstrapping with Ease

Making booting (and rebooting) a django project as easy as possible

  • Ease is a continually moving target
  • Shouldn’t sacrifice other goals for ease (e.g.

security, modularity, be PHP)

Thursday, July 19, 12
slide-11
SLIDE 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
slide-12
SLIDE 12

Problem/Solution Lifecycle

  • 1. Problem grows
  • 2. Many create their own solution; some

polish; some release

  • 3. Community flocks to one (or a few) solutions
  • 4. Solution(s) gets anointed and others die off
Thursday, July 19, 12
slide-13
SLIDE 13

Goals of Easy Bootstrapping

  • 1. More people using Django
  • 2. More people using Django better
Thursday, July 19, 12
slide-14
SLIDE 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
slide-15
SLIDE 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
slide-16
SLIDE 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
slide-17
SLIDE 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
slide-18
SLIDE 18

Standard had Better be Right

Thursday, July 19, 12
slide-19
SLIDE 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
slide-20
SLIDE 20

Android Fragmentation

http://www.businessinsider.com/android-fragmentation-chart-from-opensignalmaps-2012-5 Thursday, July 19, 12
slide-21
SLIDE 21

Flexibility vs Standardization

  • Standardization can be rigid; can kill flexibility
  • Especially as the target moves
  • E.g. contrib.auth
  • Flexibility allows preference, innovation
  • Best of both worlds is standardization with

structured options of flexibility

  • Django does this well
Thursday, July 19, 12
slide-22
SLIDE 22

Django

  • Django is a set of higher-order building blocks
  • If blocks are too large, sacrifices what can be

made (i.e. not flexibile)

  • If blocks are too small, becomes inefficient

and unmanageable

  • If block types are wrong, not loosely

coupled (i.e. non-orthogonal)

Thursday, July 19, 12
slide-23
SLIDE 23

3 Stages of Project Structure Grief

  • Denial
  • Bargaining
  • Acceptance
Thursday, July 19, 12
slide-24
SLIDE 24

Denial

  • Stuff required libraries in a ‘lib’ directory
  • Stick django there too
  • Name everything MyProjectSomething

I’ll just take the easy way out...

Thursday, July 19, 12
slide-25
SLIDE 25

Denial

  • project starts to get bloated
  • version management becomes a headache
  • upgrade paths become tangled

I’ll just take the easy way out...

Why this doesn’t work

Thursday, July 19, 12
slide-26
SLIDE 26

Bargaining

  • 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

We’ll just adopt some standard practices...

Thursday, July 19, 12
slide-27
SLIDE 27

Bargaining

  • Projects become inconsistent
  • It is not in source control
  • No way to manage changes across projects
  • There is no history of changes or discussion

We’ll just adopt some standard practices...

Why this doesn’t work

Thursday, July 19, 12
slide-28
SLIDE 28

Acceptance

  • requirements.txt, version management
  • also solves the ‘git submodule’ problem
  • virtualenv is great, always use it

Embrace the community

Thursday, July 19, 12
slide-29
SLIDE 29

Acceptance

  • dependency management
  • concurrent project management
  • sand-boxing
  • solves the “chicken-n-egg” problem
  • replication

No, really, use virtualenv

Thursday, July 19, 12
slide-30
SLIDE 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
slide-31
SLIDE 31

Toplevel is python code

  • Pros
  • More pythonic; Everything

is python code

  • It just works
  • Cons
  • Everything is python code
  • Where do non public files

go?

Django’s default template ./manage.py ./my_project/__init__.py ./my_project/settings.py ./my_project/urls.py ./my_project/wsgi.py

Thursday, July 19, 12
slide-32
SLIDE 32

Default Django Project

./manage.py ./my_project/__init__.py ./my_project/settings.py ./my_project/urls.py ./my_project/wsgi.py ./my_project/my_app/__init__.py ./my_project/my_app/models.py

  • How about ./my_project/

my_app/?

  • Name then becomes

‘my_project.my_app’

  • What about reusability?
  • What if I want to rename

my_project?

  • Where do apps go?
Thursday, July 19, 12
slide-33
SLIDE 33

Default Django Project

  • How about ./my_app/?
  • Better for reusability, but...
  • Now I have to add ./ to the

PYTHON_PATH

  • Where do apps go?

./manage.py ./my_project/__init__.py ./my_project/settings.py ./my_project/urls.py ./my_project/wsgi.py ./my_app/__init__.py ./my_app/models.py

Thursday, July 19, 12
slide-34
SLIDE 34

Default Django Project

  • Was it ‘myapp1’ or ‘myapp2’

that contains the main urls and settings...

  • What was the name

again?

./manage.py ./myapp1/models.py ./myapp1/urls.py ./myapp2/models.py ./myapp2/urls.py ./myapp3/models.py ./myapp3/urls.py

Thursday, July 19, 12
slide-35
SLIDE 35

Toplevel is website project

  • Pros
  • Closer to real world

environments

  • Consistency across

projects

  • Cons
  • ??? None I guess!

http://github.com/concentricsky/djenesis-template.git

./manage.py ./wsgi.py ./requirements.txt ./apps/mainsite/__init__.py ./apps/mainsite/settings.py ./apps/mainsite/settings_local.py ./apps/mainsite/urls.py ./apps/my_app/models.py ./apps/my_app/urls.py Thursday, July 19, 12
slide-36
SLIDE 36
  • only have to add ./apps to PYTHON_PATH
  • everything else is ignored by WSGI server
./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 Toplevel is website project

Thursday, July 19, 12
slide-37
SLIDE 37
  • I always know where to look first: ./apps/

mainsite/urls.py

  • More important than it may seem at first blush
./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 Toplevel is website project

Thursday, July 19, 12
slide-38
SLIDE 38
  • 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.
./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 Toplevel is website project

Thursday, July 19, 12
slide-39
SLIDE 39
  • Library dependencies and versioning is simple.
  • New developers can start working quicker.
  • Simple virtualenv integration
./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 Toplevel is website project

Thursday, July 19, 12
slide-40
SLIDE 40

Okay, but now what?

  • 1. Install and use virtualenv
  • 2. Design and use a template
Thursday, July 19, 12
slide-41
SLIDE 41

How hard can it be?

Thursday, July 19, 12
slide-42
SLIDE 42

Taking a closer look

$ git clone http://github.com/my/template.git /tmp/ mytemplate $ pip install django>=1.4 $ django-admin.py startproject --template=/tmp/ mytemplate ~/myproject/code $ rm -rf /tmp/mytemplate

$ mkvirtualenv myproject && workon myproject

OR

$ virtualenv ~/myproject/env && source ~/myproject/env/ bin/activate

THEN

Thursday, July 19, 12
slide-43
SLIDE 43

Our approach

Djenesis: our solution to the bootstrapping problem

Thursday, July 19, 12
slide-44
SLIDE 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
slide-45
SLIDE 45

djenesis - Benefits

  • Simplifies routine workflows 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
slide-46
SLIDE 46

djenesis - History

  • 1. Single zip file 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
slide-47
SLIDE 47

djenesis - External Templates

  • Inflating 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
slide-48
SLIDE 48

djenesis Stack

Thursday, July 19, 12
slide-49
SLIDE 49

djenesis - Setup

  • Requires virtualenv
  • Install virtualenv through pip or easy_install
  • Install djenesis through pip or easy_install
Thursday, July 19, 12
slide-50
SLIDE 50

djenesis – New Project

Before

$ virtualenv ~/myproject/env $ source ~/myproject/env/bin/activate $ pip install django $ git clone github.com/my/template.git /tmp/tmpl $ django-admin.py startproject --template=/tmp/tmpl ~/ myproject/code $ rm -rf /tmp/tmpl

With djenesis

$ djenesis myproject git+https://github.com/my/template.git $ source ~/myproject/env/bin/activate

Thursday, July 19, 12
slide-51
SLIDE 51

djenesis – Existing Project

Before

$ virtualenv ~/myproject/env $ source ~/myproject/env/bin/activate $ git clone github.com/my/project.git ~/myproject/code $ pip install -r ~/myproject/code/requirements.txt

With djenesis

$ djenesis myproject -i git+https://github.com/my/project.git $ source ~/myproject/env/bin/activate

Thursday, July 19, 12
slide-52
SLIDE 52

djenesis - Configuration

  • 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
slide-53
SLIDE 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 fixtures)

  • 4. Activate virtualenv when djenesis is called
Thursday, July 19, 12
slide-54
SLIDE 54

Bootstrapping Django with ease

OSCON 2012 www.concentricsky.com @concentricsky // biglan / wiggins / bothun Thursday, July 19, 12