Download presentation
Presentation is loading. Please wait.
Published byJaniya Merriam Modified over 10 years ago
1
{ Django Deployment Tips, Tricks and Best Practices Erik LaBianca, WiserTogether, Inc.
2
You mission, should you choose to accept it: Make your application run with 1 click, everywhere it counts, every time. Make your application run exactly the same way, everywhere it counts, every time. Prove that the above are true. Reproducibility
3
Reproducible Infrastructure Reproducible Systems Reproducible [Django] Applications Dependencies Configuration Data Deployment Steps to Reproducibility
4
Systems: Virtual or Physical Power Management Console Backup / Restore Network Layer Load Balancing Security Performance Infrastructure
5
A Stable Foundation Stable Operating System Reproducible Installation Kickstart Install Base Image Configuration Management Puppet, Chef Packaging Systems
6
What Python? Database? Backup / Restore Failover Performance Caching? HTTP Objects Queuing? SSL? Application Environment
7
It’s just code, right? Probably Not Application
8
Just use pip! Not so fast. Lots of external dependencies Eliminate them with a local cache Don’t’ forget virtualenv! Dependencies lib/pypi-cache: Django-1.4.3.tar.gz requirements.txt: Django==1.4.3 Type this: pip install --no-index --find-links file://$(PWD)/lib/pypi-cache -r requirements.txt
9
settings.py No logic allowed! “unknown” import times Critical Local_settings.py More of the same Consider pushing configuration in externally via environ, configparser, etc Configuration settings.py: from urlparse import urljoin from os import environ import dj_database_url #courtesy of Heroku DATABASES = dj_database.config(default=“xxx”) BASE_URL = environ[‘DJANGO_BASE_URL’] STATIC_URL = urljoin(BASE_URL, ‘static’) MEDIA_URL = urljoin(BASE_URL, ‘media’) Run this: DJANGO_BASE_URL=http://cdn.com/base/ django-admin.py runserverhttp://cdn.com/base/
10
Fixtures. Consider writing them in Python! Testable More resilient to change Less pk pain Migrations! Test them Database fixtures/polls.py: from..models import Poll, Choice def apply(): p = Poll.objects.get_or_create(q=‘test q’, defaults=dict(pub_date=‘1980-01-01)) c1 = Choices.objects.get_or_create(poll=p, choice_text=‘option 1’) fixtures/tests/test_poll.py: Class PollFixtureTestCase(TestCase): def test_fixture_applied(): self.assertEquals(Poll.objects.get(q=‘test q’)
11
management/__init__.py: from django.db.models.signals import post_syncdb from south.signals import post_migrate from.. import models, fixtures def update_poll_fixtures(verbose=True): fixtures.poll.apply() if verbose: print "Updating dynamic fixtures for profile” def update_fixtures_post_syncdb(sender, **kwargs): update_poll_fixtures() def update_fixtures_post_migrate(app, **kwargs): if app == ’polls': update_poll_fixtures() post_syncdb.connect(fixtures_post_syncdb, sender=models) post_migrate.connect(fixtures_post_migrate)
12
Back Up Everything! Move files to Green Fabric? RPM? Tar? Git? Rsync? Update Stuff syncdb apply fixtures Test Green! Flip/Flop Blue/Green (Roll back to Blue) Deployment: Blue/Green Data App Interwebs Deploy / Test
13
Erik LaBianca, WiserTogether, Inc. erik.labianca@gmail.com@easelhttps://linkedin.com/in/eriklabianca/https://slideshare.net/easel1/https://github.com/easel/https://github.com/WiserTogether/ Questions?
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.