Django + Flask

Django + Flask

Configure Flask for Django 1.8.

9dafad54b5b4f360b7aae5f482bc1c91?s=128

Tzu-ping Chung

September 08, 2015
Tweet

Transcript

  1. Django + Jinja2

  2. Django Templates • The Django Template Language • How Django

    loads templates
  3. Django Templates • The Django Template Language • How Django

    loads templates DTL
  4. <ul>      {%  for  user  in  users.all  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username|capitalize  }}          </a>      </li>      {%  endfor  %}   </ul>
  5. <ul>      {%  for  user  in  users.all  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username|capitalize  }}          </a>      </li>      {%  endfor  %}   </ul> (Template) Tag
  6. <ul>      {%  for  user  in  users.all  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username|capitalize  }}          </a>      </li>      {%  endfor  %}   </ul> Variable
  7. <ul>      {%  for  user  in  users.all  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username|capitalize  }}          </a>      </li>      {%  endfor  %}   </ul> Variable + Filter
  8. The DTL • Simple syntax with few rules • Lightweight

    extensions • Self-contained
  9. But… • Awkward DSL • No scoped functions • Slow

    with frequent rendering
  10. Django 1.8 • django.template • django.template.backends

  11. TEMPLATE_CONTEXT_PROCESSORS   TEMPLATE_DEBUG   TEMPLATE_STRING_IF_INVALID   TEMPLATE_DIRS   TEMPLATE_LOADERS The

    Language The System
  12. TEMPLATE_CONTEXT_PROCESSORS   TEMPLATE_DEBUG   TEMPLATE_STRING_IF_INVALID   TEMPLATE_DIRS   TEMPLATE_LOADERS The

    Language The System
  13. TEMPLATES  =  [          {    

                 'BACKEND':  '...',                  'DIRS':  [],                'OPTIONS':  {                          'context_processors':  [...],                          'debug':  False,                          'string_if_invalid':  '',                  },          },   ] Language-specific Setup Template-loading Setup
  14. None
  15. Jinja2 • Armin Ronacher (aka mitsuhiko) • Inspired by the

    DTL • Standalone library • More programmer-friendly
  16. <ul>      {%  for  user  in  users.all()  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username.toupper()  }}          </a>      </li>      {%  endfor  %}   </ul> Function calling
  17. <ul>      {%  for  user  in  users.get_friends(me)  %}  

       <li>          <a  href="{{  user.url  }}">              {{  user.username.toupper()  }}          </a>      </li>      {%  endfor  %}   </ul>
  18. Settings for Jinja2 {          'BACKEND':  (

                     'django.template.backends.'                  'jinja2.Jinja2'),          'DIRS':  [],          'APP_DIRS':  True,   },
  19. demoapp ├── jinja2 │ └── a_jinja2_template.html ├── models.py ├── templates

    │ └── a_django_template.html ├── urls.py └── views.py
  20. demoapp ├── jinja2 │ └── a_jinja2_template.html ├── models.py ├── templates

    │ └── a_django_template.html ├── urls.py └── views.py Configurable (not recommended)
  21. Jinja2 for Django • Auto-escape on • Custom template loader

    • Debug enhancements • Auto-reload • Undefined raises exceptions
  22. But • Jinja2 is not built (just) for Web •

    Web-related functionalities • Django internals
  23. {%  url  'pages:page'  name=page_name  %}   {%  static  'base/css/site.min.css'  %}

      {%  trans  'This  is  my  website!'  %}   {%  csrf_token  %}
  24. https://github.com/MoritzS/jinja2-django-tags

  25. {          'BACKEND':  ('django.template.backends.'      

                               'jinja2.Jinja2'),          'DIRS':  [],          'APP_DIRS':  True,          'OPTIONS':  {                  'extensions':  [                          'jdj_tags.extensions.DjangoStatic',                          'jdj_tags.extensions.DjangoI18n',                  ]          },   },
  26. Jinja2 vs DTL • Functions vs template tags • Methods

    vs filters • Extensions are loaded by project
  27. The Flask Way • {%  url_for(endpoint,  **kwargs)  %} • Endpoint

    'static' • {%  get_flashed_messages(...)  %} • I18n API (already pretty similar) • {{  csrf_token()  }}
  28. To boldly go where no one has gone before.