$30 off During Our Annual Pro Sale. View Details »

The year ahead (DjangoCon 2012)

The year ahead (DjangoCon 2012)

BDFL keynote from DjangoCon US (Washington, DC), Sept. 5, 2012.

adrianholovaty

September 05, 2012
Tweet

More Decks by adrianholovaty

Other Decks in Programming

Transcript

  1. View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. The year ahead
    Adrian Holovaty
    DjangoCon 2012

    View Slide

  11. • Alpha: Oct. 1 (feature freeze, branch created)
    • Beta: Nov. 1-ish
    • Release candidate 1: end of November
    • Release candidate 2: early December
    • Final: Christmas!
    Django 1.5 timeline

    View Slide

  12. View Slide

  13. View Slide

  14. Separate localflavor packages
    django-localflavor-ar
    django-localflavor-at
    django-localflavor-au
    django-localflavor-be
    django-localflavor-br
    django-localflavor-ca
    django-localflavor-ch
    django-localflavor-cl
    django-localflavor-cn
    ...

    View Slide

  15. • Django 1.5: Deprecation warning
    • Django 1.6: Separate (bundled) packages,
    shim in repo
    • Django 1.7: HTTP 410 (GONE)
    Deprecation policy

    View Slide

  16. >>> from django.contrib import comments
    Traceback (most recent call last):
    File "", line 1, in
    ImportError: What, you actually USE this
    monstrosity?!

    View Slide

  17. >>> from django.contrib import databrowse
    Traceback (most recent call last):
    File "", line 1, in
    ImportError: Sorry, it was a cool concept,
    but we never got around to
    finishing it.

    View Slide

  18. >>> from django.conf import settings
    >>> settings.PROFANITIES_LIST
    Traceback (most recent call last):
    File "", line 1, in
    FrameworkPlea: Oh, God, please just let
    this setting die already.

    View Slide

  19. >>> from django.conf import settings
    >>> settings.SEND_BROKEN_LINK_EMAILS = True
    Traceback (most recent call last):
    File "", line 1, in
    StupidSettingsError: C’mon.

    View Slide

  20. >>> from django.conf import settings
    >>> settings.SEND_BROKEN_LINK_EMAILS = True
    Traceback (most recent call last):
    File "", line 1, in
    StupidSettingsError:

    View Slide

  21. >>> from django.conf import settings
    >>> settings.AUTH_PROFILE_MODULE
    Traceback (most recent call last):
    File "", line 1, in
    ThatStinks: Code smell detected

    View Slide

  22. class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(blank=True)
    password = models.CharField(max_length=128)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    last_login = models.DateTimeField(default=timezone.now)
    date_joined = models.DateTimeField(default=timezone.now)
    groups = models.ManyToManyField(Group)
    user_permissions = models.ManyToManyField(Permission)

    View Slide

  23. In myapp/models.py
    from django.contrib.auth.models import User
    class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    # Other fields here
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)

    View Slide

  24. In myapp/models.py
    from django.contrib.auth.models import User
    class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    # Other fields here
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)
    In settings.py
    AUTH_PROFILE_MODULE = 'myapp.UserProfile'

    View Slide

  25. In myapp/models.py
    from django.contrib.auth.models import User
    class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    # Other fields here
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)
    In settings.py
    AUTH_PROFILE_MODULE = 'myapp.UserProfile'
    In views.py
    request.user.get_profile()

    View Slide

  26. In myapp/models.py
    class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=128)
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)

    View Slide

  27. In myapp/models.py
    class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=128)
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)
    In settings.py
    USER_MODEL = 'myapp.User'

    View Slide

  28. In myapp/models.py
    class User(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=128)
    favorite_animal = models.CharField(max_length=20)
    favorite_beatle = models.CharField(max_length=20)
    In settings.py
    USER_MODEL = 'myapp.User'
    In views.py
    request.user

    View Slide

  29. • Backwards compatible: fall back to old
    auth.User model
    • Any User model can work with the admin,
    using a clearly defined interface
    Design goals

    View Slide

  30. ImportError: Settings cannot be imported, because environment
    variable DJANGO_SETTINGS_MODULE is undefined.

    View Slide

  31. def mypage(request, slug):
    obj = MyModel.objects.get(slug=slug)
    return render(request, 'mypage.html', {'obj': obj})

    View Slide

  32. def mypage(request, slug):
    obj = MyModel.objects.get(slug=slug)
    return render(request, 'mypage.html', {'obj': obj})
    Connection info?

    View Slide

  33. def mypage(request, slug):
    obj = MyModel.objects.get(slug=slug)
    return render(request, 'mypage.html', {'obj': obj})
    Connection info?
    Template location?

    View Slide

  34. def mypage(request, slug):
    obj = request.app.query(MyModel).get(slug=slug)
    return request.app.render('mypage.html', {'obj': obj})

    View Slide

  35. def mypage(request, slug):
    obj = request.app.query(MyModel).get(slug=slug)
    return request.app.render('mypage.html', {'obj': obj})
    app.query()

    View Slide

  36. def mypage(request, slug):
    obj = request.app.query(MyModel).get(slug=slug)
    return request.app.render('mypage.html', {'obj': obj})
    app.query()
    app.render()

    View Slide

  37. def mypage(request, slug):
    obj = request.app.query(MyModel).get(slug=slug)
    return request.app.render('mypage.html', {'obj': obj})
    from django import YetAnotherAppClass
    app = YetAnotherAppClass(settings={
    'DATABASES': '...',
    'TEMPLATE_DIRS': ['/path/to/templates'],
    }, rootview=my_urls)
    app.runserver()

    View Slide

  38. >>> from django import javascript_stuff
    Traceback (most recent call last):
    File "", line 1, in
    NotImplementedYet: But it’s about time.

    View Slide

  39. PJAX
    (P = pushstate)

    View Slide

  40. Web framework

    View Slide

  41. Web framework
    returns full page
    Web framework
    returns full page

    View Slide

  42. View Slide

  43. Web framework
    returns full page
    Web framework
    returns *diff*
    and changes URL

    View Slide

  44. Overview

    View Slide

  45. Overview
    Click link
    Trigger Ajax request

    View Slide

  46. Overview
    Click link
    Trigger Ajax request
    Server says: “These bits changed”

    View Slide

  47. Overview
    Click link
    Trigger Ajax request
    Server says: “These bits changed”
    JavaScript changes the page in place

    View Slide

  48. Overview
    Click link
    Trigger Ajax request
    Server says: “These bits changed”
    JavaScript changes the page in place
    URL gets updated with pushstate

    View Slide

  49. MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.pjax.middleware.PjaxMiddleware',
    )

    View Slide

  50. http://tinyurl.com/pjaxvideo

    View Slide

  51. Real-time

    View Slide

  52. Content
    sites
    Applications
    # of sites

    View Slide

  53. Content
    sites
    Applications
    # of sites

    View Slide

  54. Content
    sites
    Applications
    # of sites
    Move this to the right

    View Slide

  55. Thanks for using Django
    Love, Adrian

    View Slide