Django Worst Practices
                          Daniel Greenfeld




Tuesday, April 19, 2011
Django Worst Practices

                           Whole
                          project in
                           one app



Tuesday, April 19, 2011
Django Worst Practices

                           Whole
                          project in
                           one app

                               All your stuff in one place!


Tuesday, April 19, 2011
Django Worst Practices

                           Whole
                          project in
                           one app

                     All your stuff in one place!
          No need to worry about bugfixes or enhancements!
Tuesday, April 19, 2011
Django Worst Practices
  pydanny: pwd
  /Users/pydanny/projects/enterprise/settings
  pydanny: ls -l
  total 24
  -rw-r--r-- 1 pydanny staff 0 Apr 18 22:38 __init__.py
  lrwxr-xr-x 1 pydanny staff 21 Apr 18 22:42 dev.py -> /Users/pydanny/dev.py
  lrwxr-xr-x 1 pydanny staff 22 Apr 18 22:42 prod.py -> /Users/pydanny/prod.py
  lrwxr-xr-x 1 pydanny staff 25 Apr 18 22:42 staging.py -> /Users/pydanny/staging.py


                Symlink your settings folder!
                          Cause you’ll remember to do this with each server setup...




Tuesday, April 19, 2011
Django Worst Practices
                          Database Choices




Tuesday, April 19, 2011
Django Worst Practices
                              Database Choices
                     • Use a relational database to store ill-
                          defined hierarchical data!




Tuesday, April 19, 2011
Django Worst Practices
                              Database Choices
                     • Use a relational database to store ill-
                          defined hierarchical data!
                     • Use NoSQL to store tabular data!


Tuesday, April 19, 2011
Django Worst Practices
                          <%python scope="global">
                              # declare global variables, accessible
                              # across this component's generated module

                              message1 = "this is message one."
                              message2 = "this is message two."
                              message3 = "doh, im message three."
                          </%python>

                          <%python>
                              # reference the global variables
                              m.write("message one: " + message1)
                              m.write("message two: " + message2)

                              # we want to assign to message3,
                              # so declare "global" first
                              global message3

                              message3 = "this is message three."

                              m.write("message three: " + message3)

                          </%python>




Tuesday, April 19, 2011
Django Worst Practices
                          <%python scope="global">
                              # declare global variables, accessible
                              # across this component's generated module

                              message1 = "this is message one."
                              message2 = "this is message two."
                              message3 = "doh, im message three."
                          </%python>

                          <%python>
                              # reference the global variables
                              m.write("message one: " + message1)
                              m.write("message two: " + message2)

                              # we want to assign to message3,
                              # so declare "global" first
                              global message3

                              message3 = "this is message three."

                              m.write("message three: " + message3)

                          </%python>


                          Who needs caching?



Tuesday, April 19, 2011
Django Worst Practices
                             <%python scope="global">
                                 # declare global variables, accessible
                                 # across this component's generated module

                                 message1 = "this is message one."
                                 message2 = "this is message two."
                                 message3 = "doh, im message three."
                             </%python>

                             <%python>
                                 # reference the global variables
                                 m.write("message one: " + message1)
                                 m.write("message two: " + message2)

                                 # we want to assign to message3,
                                 # so declare "global" first
                                 global message3

                                 message3 = "this is message three."

                                 m.write("message three: " + message3)

                             </%python>


                             Who needs caching?
                          Performance awesomeness!

Tuesday, April 19, 2011
Django Worst Practices
                                <%python scope="global">
                                    # declare global variables, accessible
                                    # across this component's generated module

                                    message1 = "this is message one."
                                    message2 = "this is message two."
                                    message3 = "doh, im message three."
                                </%python>

                                <%python>
                                    # reference the global variables
                                    m.write("message one: " + message1)
                                    m.write("message two: " + message2)

                                    # we want to assign to message3,
                                    # so declare "global" first
                                    global message3

                                    message3 = "this is message three."

                                    m.write("message three: " + message3)

                                </%python>


                                Who needs caching?
                            Performance awesomeness!
                          Replaces pesky django templates!
Tuesday, April 19, 2011
Django Worst Practices
                                <%python scope="global">
                                    # declare global variables, accessible
                                    # across this component's generated module

                                    message1 = "this is message one."
                                    message2 = "this is message two."
                                    message3 = "doh, im message three."
                                </%python>

                                <%python>
                                    # reference the global variables
                                    m.write("message one: " + message1)
                                    m.write("message two: " + message2)

                                    # we want to assign to message3,
                                    # so declare "global" first
                                    global message3

                                    message3 = "this is message three."

                                    m.write("message three: " + message3)

                                </%python>


                                Who needs caching?
                            Performance awesomeness!
                          Replaces pesky django templates!
Tuesday, April 19, 2011
Django Worst Practices
                            <?xml version="1.0" encoding="UTF-8"?>
                            <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                              <xsl:output method="xml" indent="yes"/>

                              <xsl:template match="/persons">
                                <root>
                                  <xsl:apply-templates select="person"/>
                                </root>
                              </xsl:template>

                              <xsl:template match="person">
                                <name username="{@username}">
                                  <xsl:value-of select="name" />
                                </name>
                              </xsl:template>

                            </xsl:stylesheet>




                          Use XSLT for awesome performance!


Tuesday, April 19, 2011
Django Worst Practices
                          Put critical business logic in...




Tuesday, April 19, 2011
Django Worst Practices
                          Put critical business logic in...

                                  • The templates




Tuesday, April 19, 2011
Django Worst Practices
                          Put critical business logic in...

                                  • The templates
                                  • settings




Tuesday, April 19, 2011
Django Worst Practices
                          Put critical business logic in...

                                  • The templates
                                  • settings
                                  • The context processors



Tuesday, April 19, 2011
Django Worst Practices
                          Put critical business logic in...

                                  •   The templates
                                  •   settings
                                  •   The context processors
                                  •   Middleware!



Tuesday, April 19, 2011
Django Worst Practices


                          Use metaclasses instead of abstract models!




Tuesday, April 19, 2011
Django Worst Practices
   In settings:
                from django.db import models
                blog2_fields = [
                          models.CharField(“title”, max_length=50),
                          models.TextField(“note”)
                ]

Tuesday, April 19, 2011
Django Worst Practices

                           Present using
                           Different fonts
                             Dark text
                          Dire backgrounds

Tuesday, April 19, 2011
Django Worst Practices
                                       Don’t use



                          http://djangopackages.com

                               Invent everything yourself!



Tuesday, April 19, 2011

Django Worst Practices

  • 1.
    Django Worst Practices Daniel Greenfeld Tuesday, April 19, 2011
  • 2.
    Django Worst Practices Whole project in one app Tuesday, April 19, 2011
  • 3.
    Django Worst Practices Whole project in one app All your stuff in one place! Tuesday, April 19, 2011
  • 4.
    Django Worst Practices Whole project in one app All your stuff in one place! No need to worry about bugfixes or enhancements! Tuesday, April 19, 2011
  • 5.
    Django Worst Practices pydanny: pwd /Users/pydanny/projects/enterprise/settings pydanny: ls -l total 24 -rw-r--r-- 1 pydanny staff 0 Apr 18 22:38 __init__.py lrwxr-xr-x 1 pydanny staff 21 Apr 18 22:42 dev.py -> /Users/pydanny/dev.py lrwxr-xr-x 1 pydanny staff 22 Apr 18 22:42 prod.py -> /Users/pydanny/prod.py lrwxr-xr-x 1 pydanny staff 25 Apr 18 22:42 staging.py -> /Users/pydanny/staging.py Symlink your settings folder! Cause you’ll remember to do this with each server setup... Tuesday, April 19, 2011
  • 6.
    Django Worst Practices Database Choices Tuesday, April 19, 2011
  • 7.
    Django Worst Practices Database Choices • Use a relational database to store ill- defined hierarchical data! Tuesday, April 19, 2011
  • 8.
    Django Worst Practices Database Choices • Use a relational database to store ill- defined hierarchical data! • Use NoSQL to store tabular data! Tuesday, April 19, 2011
  • 9.
    Django Worst Practices <%python scope="global"> # declare global variables, accessible # across this component's generated module message1 = "this is message one." message2 = "this is message two." message3 = "doh, im message three." </%python> <%python> # reference the global variables m.write("message one: " + message1) m.write("message two: " + message2) # we want to assign to message3, # so declare "global" first global message3 message3 = "this is message three." m.write("message three: " + message3) </%python> Tuesday, April 19, 2011
  • 10.
    Django Worst Practices <%python scope="global"> # declare global variables, accessible # across this component's generated module message1 = "this is message one." message2 = "this is message two." message3 = "doh, im message three." </%python> <%python> # reference the global variables m.write("message one: " + message1) m.write("message two: " + message2) # we want to assign to message3, # so declare "global" first global message3 message3 = "this is message three." m.write("message three: " + message3) </%python> Who needs caching? Tuesday, April 19, 2011
  • 11.
    Django Worst Practices <%python scope="global"> # declare global variables, accessible # across this component's generated module message1 = "this is message one." message2 = "this is message two." message3 = "doh, im message three." </%python> <%python> # reference the global variables m.write("message one: " + message1) m.write("message two: " + message2) # we want to assign to message3, # so declare "global" first global message3 message3 = "this is message three." m.write("message three: " + message3) </%python> Who needs caching? Performance awesomeness! Tuesday, April 19, 2011
  • 12.
    Django Worst Practices <%python scope="global"> # declare global variables, accessible # across this component's generated module message1 = "this is message one." message2 = "this is message two." message3 = "doh, im message three." </%python> <%python> # reference the global variables m.write("message one: " + message1) m.write("message two: " + message2) # we want to assign to message3, # so declare "global" first global message3 message3 = "this is message three." m.write("message three: " + message3) </%python> Who needs caching? Performance awesomeness! Replaces pesky django templates! Tuesday, April 19, 2011
  • 13.
    Django Worst Practices <%python scope="global"> # declare global variables, accessible # across this component's generated module message1 = "this is message one." message2 = "this is message two." message3 = "doh, im message three." </%python> <%python> # reference the global variables m.write("message one: " + message1) m.write("message two: " + message2) # we want to assign to message3, # so declare "global" first global message3 message3 = "this is message three." m.write("message three: " + message3) </%python> Who needs caching? Performance awesomeness! Replaces pesky django templates! Tuesday, April 19, 2011
  • 14.
    Django Worst Practices <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/persons"> <root> <xsl:apply-templates select="person"/> </root> </xsl:template> <xsl:template match="person"> <name username="{@username}"> <xsl:value-of select="name" /> </name> </xsl:template> </xsl:stylesheet> Use XSLT for awesome performance! Tuesday, April 19, 2011
  • 15.
    Django Worst Practices Put critical business logic in... Tuesday, April 19, 2011
  • 16.
    Django Worst Practices Put critical business logic in... • The templates Tuesday, April 19, 2011
  • 17.
    Django Worst Practices Put critical business logic in... • The templates • settings Tuesday, April 19, 2011
  • 18.
    Django Worst Practices Put critical business logic in... • The templates • settings • The context processors Tuesday, April 19, 2011
  • 19.
    Django Worst Practices Put critical business logic in... • The templates • settings • The context processors • Middleware! Tuesday, April 19, 2011
  • 20.
    Django Worst Practices Use metaclasses instead of abstract models! Tuesday, April 19, 2011
  • 21.
    Django Worst Practices In settings: from django.db import models blog2_fields = [ models.CharField(“title”, max_length=50), models.TextField(“note”) ] Tuesday, April 19, 2011
  • 22.
    Django Worst Practices Present using Different fonts Dark text Dire backgrounds Tuesday, April 19, 2011
  • 23.
    Django Worst Practices Don’t use http://djangopackages.com Invent everything yourself! Tuesday, April 19, 2011