Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Что нового в Django 1.4
         Илья Барышев




     Moscow Django Meetup #2
Чуточку статистики

• ровно 1 год разработки
• ~1900 коммитов
• 28 core committers
• 524 человека в AUTHORS.txt
Версии Python

Django 1.3   Python 2.4-2.7



Django 1.4   Python 2.5-2.7



Django 1.5   Python 2.6-3.3*
Часовые пояса
ORM

• bulk_create()
• select_for_update()
• prefetch_related()
Структура проекта
         До 1.4                         С 1.4

mysite/                       manage.py
        __init__.py           mysite/
        manage.py                     __init__.py
        settings.py                   settings.py
        urls.py                       urls.py
        myapp/                        myapp/
                __init__.py                   __init__.py
                models.py                     models.py
Новый manage.py
#!/usr/bin/env  python
import  os,  sys

if  __name__  ==  "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE",
                                                "{{  project_name  }}.settings")

    from  django.core.management  import  execute_from_command_line

    execute_from_command_line(sys.argv)
Шаблон проекта
         http://bit.ly/django_project_template
django-­‐admin.py  startproject  -­‐-­‐template=<url>  <project>

                  project_name/
                  	
  	
  	
  	
  fixtures/
                  	
  	
  	
  	
  public/
                  	
  	
  	
  	
  static/
                  	
  	
  	
  	
  templates/
                          __init__.py__
                          __local_settings.py
                          local_settings.py
                          settings.py
                          urls.py  
                          wsgi.py
                  .gitignore
                  manage.py
                  requirements.txt
Админка
•   Пользовательские фильтры
•   Множественная сортировка
•   Новые методы ModelAdmin
    • ModelAdmin.save_related(self,  request,  form,  formsets,  change)
    • ModelAdmin.get_list_display(self,  request)
    • ModelAdmin.get_list_display_links(self,  request,  list_display)
•   ADMIN_MEDIA_PREFIX deprecated
Шаблоны
• {%  elif  %}
• {%  static  %}
• |truncatechars
• Key-value аргументы для тегов
• assignment-теги
• Контекстные пометки для перевода
Assignment-теги

@register.assignment_tag
def  get_current_time(format_string):
        return  datetime.datetime.now().strftime(format_string)

{%  get_current_time  "%Y-­‐%m-­‐%d  %I:%M  %p"  as  the_time  %}
The  time  is  {{  the_time  }}.
Контекстные пометки
        для перевода

{%  trans  "May"  context  "month  name"  %}
{%  trans  "May"  context  "verb"  %}
{%  blocktrans  with  name=user.username  context  "greeting"  %}
        Hi  {{  name  }}
{%  endblocktrans  %}
URL i18n
Безопасность

• Новый механизм хэширования паролей
• Защита от кликджекинга (clickjacking)
• Улучшения в защите от CSRF- и XSS-атак
Криптографическая
         подпись

• Низкоуровневое API (Signer)
• Бэкенд сессий на подписанных куках
• Новый FormWizard на CBV
Тестирование
• with  TestCase.settings(**kwargs)
• и @TestCase.override_settings(**kwargs)
• SimpleTestCase
 •   assertRaisesMessage(expected_exception,  
     expected_message,  callable_obj=None,  *args,  **kwargs)

 •   assertFieldOutput(self,  fieldclass,  valid,  invalid,  
     field_args=None,  field_kwargs=None,empty_value=u'')

 •   assertHTMLEqual(html1,  html2,  msg=None)
Браузерное тестирование
class  AdminSeleniumWebDriverTestCase(LiveServerTestCase):
        ...

class  DateTimePickerSelenium(AdminSeleniumWebDriverTestCase):

        def  test_show_hide_date_time_picker_widgets(self):

                self.admin_login(username='super',  password='123')
                #  Open  a  page  that  has  a  date  and  time  picker  widgets
                self.selenium.get('%s%s'  %  (self.live_server_url,
                        '/admin_widgets/member/add/'))

                #  Check  that  the  date  picker  is  hidden
                self.assertEqual(
                        self.get_css_value('#calendarbox0',  'display'),  'none')
                #  Click  the  calendar  icon
                self.selenium.find_element_by_id('calendarlink0').click()
                #  Check  that  the  date  picker  is  visible
                self.assertEqual(
                        self.get_css_value('#calendarbox0',  'display'),  'block')
Спасибо



baryshev@futurecolors.ru
@coagulant                 http://blog.futurecolors.ru/

More Related Content

Что нового в Django 1.4

  • 1. Что нового в Django 1.4 Илья Барышев Moscow Django Meetup #2
  • 2. Чуточку статистики • ровно 1 год разработки • ~1900 коммитов • 28 core committers • 524 человека в AUTHORS.txt
  • 3. Версии Python Django 1.3 Python 2.4-2.7 Django 1.4 Python 2.5-2.7 Django 1.5 Python 2.6-3.3*
  • 6. Структура проекта До 1.4 С 1.4 mysite/ manage.py        __init__.py mysite/        manage.py        __init__.py        settings.py        settings.py        urls.py        urls.py        myapp/        myapp/                __init__.py                __init__.py                models.py                models.py
  • 7. Новый manage.py #!/usr/bin/env  python import  os,  sys if  __name__  ==  "__main__":    os.environ.setdefault("DJANGO_SETTINGS_MODULE",                                                "{{  project_name  }}.settings")    from  django.core.management  import  execute_from_command_line    execute_from_command_line(sys.argv)
  • 8. Шаблон проекта http://bit.ly/django_project_template django-­‐admin.py  startproject  -­‐-­‐template=<url>  <project> project_name/        fixtures/        public/        static/        templates/        __init__.py__        __local_settings.py        local_settings.py        settings.py        urls.py          wsgi.py .gitignore manage.py requirements.txt
  • 9. Админка • Пользовательские фильтры • Множественная сортировка • Новые методы ModelAdmin • ModelAdmin.save_related(self,  request,  form,  formsets,  change) • ModelAdmin.get_list_display(self,  request) • ModelAdmin.get_list_display_links(self,  request,  list_display) • ADMIN_MEDIA_PREFIX deprecated
  • 10. Шаблоны • {%  elif  %} • {%  static  %} • |truncatechars • Key-value аргументы для тегов • assignment-теги • Контекстные пометки для перевода
  • 11. Assignment-теги @register.assignment_tag def  get_current_time(format_string):        return  datetime.datetime.now().strftime(format_string) {%  get_current_time  "%Y-­‐%m-­‐%d  %I:%M  %p"  as  the_time  %} The  time  is  {{  the_time  }}.
  • 12. Контекстные пометки для перевода {%  trans  "May"  context  "month  name"  %} {%  trans  "May"  context  "verb"  %} {%  blocktrans  with  name=user.username  context  "greeting"  %}        Hi  {{  name  }} {%  endblocktrans  %}
  • 14. Безопасность • Новый механизм хэширования паролей • Защита от кликджекинга (clickjacking) • Улучшения в защите от CSRF- и XSS-атак
  • 15. Криптографическая подпись • Низкоуровневое API (Signer) • Бэкенд сессий на подписанных куках • Новый FormWizard на CBV
  • 16. Тестирование • with  TestCase.settings(**kwargs) • и @TestCase.override_settings(**kwargs) • SimpleTestCase • assertRaisesMessage(expected_exception,   expected_message,  callable_obj=None,  *args,  **kwargs) • assertFieldOutput(self,  fieldclass,  valid,  invalid,   field_args=None,  field_kwargs=None,empty_value=u'') • assertHTMLEqual(html1,  html2,  msg=None)
  • 17. Браузерное тестирование class  AdminSeleniumWebDriverTestCase(LiveServerTestCase):        ... class  DateTimePickerSelenium(AdminSeleniumWebDriverTestCase):        def  test_show_hide_date_time_picker_widgets(self):                self.admin_login(username='super',  password='123')                #  Open  a  page  that  has  a  date  and  time  picker  widgets                self.selenium.get('%s%s'  %  (self.live_server_url,                        '/admin_widgets/member/add/'))                #  Check  that  the  date  picker  is  hidden                self.assertEqual(                        self.get_css_value('#calendarbox0',  'display'),  'none')                #  Click  the  calendar  icon                self.selenium.find_element_by_id('calendarlink0').click()                #  Check  that  the  date  picker  is  visible                self.assertEqual(                        self.get_css_value('#calendarbox0',  'display'),  'block')