Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемwww.devconf.ru
1 Почему стоит понижать кульутру производства На что обращать внимание, создавая приложения для Django Дмитрий Лебедев skype: siberianoNsk
2 2 Культура производства Программист должен не забыть. Пусть будет высокая культура производства.
3 3 Культура производства совокупность нормативных требований к технико-экономическому, организационному и эстетическому уровню производства.
4 4
5 5 С защитным кожухом гильотина требует меньшей культуры производства от рабочего. Там, где не вводят мер, облегчающих работу, случаются ошибки. В программировании эти ошибки не фатальны, и мы продолжаем их совершать.
6 6 Примеры завышенной культуры производства Что должно быть синхронным, лежит далеко Слово прописывать Огромное количество настроек, которые надо запомнить Сложные протоколы
7 7 Пример 1. Документация Ещё один пример данных, которые должны быть синхронными. Код – Документация
8 8 Пример 1. Документация Недостатки документации в Wiki – Неохота исправлять – Неточности незаметны – Размыта ответственность – Не интегрируется с IDE или консолью
9 9 Docstrings In [65]: zip? Type: builtin_function_or_method Base Class: String Form: Namespace: Python builtin Docstring: zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0]...), (...)] Return a list of tuples, where each tuple contains the i-th element from each of the argument sequences. The returned list is truncated in length to the length of the shortest argument sequence.
10 10 Docstrings Вместе с кодом – Исправить дело нескольких секунд – Неточности заметны сразу – Ответственность на авторе, проверяется на обзоре кода – Легко получить документацию из консоли или IDE Сделать документацию в виде HTML можно при помощи инструментов В Wiki храним то, что никуда не пристраивается
11 11 Антипример 1, Debug Toolbar INSTALLED_APPS = (... 'debug_toolbar',
12 12 Антипример 1, Debug Toolbar MIDDLEWARE_CLASSES = (... 'debug_toolbar.middleware.DebugToolbarMiddleware',... )
13 13 Антипример 1, Debug Toolbar INTERNAL_IPS = (' ',)
14 14 Сборка проекта $ hg clone ssh://bitbucket.org/siberiano/course.ryba4.com course $ cd course $ make run... Development server is running at Quit the server with CONTROL-C.... $ make rebuild Rebuilding the database...
15 15 Большая инструкция приводит к ошибкам Обновившиеся зависимости это отрезанные пальцы Сборка проекта
16 16 Нужен инструмент сборки, чтобы – собрать зависимости проекта на новом месте – развернуть базу данных – пересоздать базу данных – зафиксировать версии зависимостей Существующие решения: – django-fab-deploy – fastdev-django – самодельное решение на virtualenv или bootstrap.py Сборка проекта
17 17 Файлы fixtures нужно пложить по таким путям: apps/polls/dev_fixtures/initial_data.json apps/messages/dev_fixtures/initial_data.json В настройках приходится указать FIXTURE_DIRS = ( 'apps/polls/dev_fixtures/', 'apps/messages/dev_fixtures/', ) Пример 2, fixtures
18 18 Пути этих файлов строгие и уже содержат всю необходимую информацию, чтобы их найти. Решение проблемы: FIXTURES_DIRS = tuple(ln.rtrim() for ln in os.popen('find. -path "*apps*dev_fixtures"')) Пример 2, fixtures
19 19 Пример 3, спрайты.folder.opened { width: 16px; height: 16px; background-image: url("icons.gif"); background-position: -64px -16px; }
20 20 Пример 3, спрайты Настройки для приложения, делающего спрайты: sprite=Sprite.create_from_local_files(['/path/to/first/file', '/path/to/second/file'])
21 21 Пример 3, спрайты # settings.py SPRITES_DIR = 'static/img/sprites' sprites/ sprite_one/ icon1.png icon2.png sprite_two/ icon3.png icon4.png
22 22 Пример 4, urls и javascript Статический файл js: $.ajax({url: '/path/to/API/', …}) Urls.py: url(r'^api/$', api_view, name='api') Связка разваливается, когда изменяют одну из этих 2 строк.
23 23 Пример 4, urls и javascript Функция в JS: reverse_url = function(url_name, params){ params = params || {}; $.extend(params, {url_name: url_name}) return '/reverse_url/?' + $.param(params); };
24 24 Пример 4, urls и javascript Middleware: class UrlReverseMiddleware(object): def process_request(self, request): if request.path_info == '/reverse_url/': query_dict = request.GET.copy() url_name = query_dict.pop('url_name')[0] args = query_dict.pop('args', []) if args == ['']: args = []
25 25 Пример 4, urls и javascript try: request.path = request.path_info = reverse(url_name, args=args) except NoReverseMatch: raise Http404 request.GET = QueryDict(query_dict.urlencode())
26 26 Пример 4, urls и javascript Использование: reverse_url('complicated_url', {args: [1, 2], param1: 3}); /reverse_url/?url_name=complicated_url&args=[1, 2]¶m1=3 Преимущества: Адрес можно перемещать Можно искать использование адреса по его имени
27 27 Пример 5, протоколы Так можно: def view1(request, arg1, arg2): pass def view2(request, arg1, arg2): pass
28 28 Такого стоит избегать: data ={ 'location': place.name, 'date': visit.date, 'event': 'visit', 'type_of_' + place.__class__.__name__: place.place_type, } Пример 5, протоколы
29 29 Изменения всегда нужно делать в паре Не отлаживается статическим анализатором Не отлаживается дебаггером
30 30 Было переписано так: data = { 'event': visit, # объект класса Event } # visit.place место # visit.user человек
31 31 Пример 6, меню приложений Много файлов apps/app/menu.html Много файлов templates/app/url.py
32 32 Фотоальбом Календарь {% if request.user.is_authenticated() %} Входящие сообщения {% if request.user.new_msg %} ({{ request.user.new_msg }} новых) {% endif %} {% endif %} {% if request.user.is_authenticated() %} Подать заявку {% endif %}
33 33 Сложная вёрстка повторяется в шаблонах меню
34 34 urlpatterns = patterns('views', item(url(r'^photos$', 'photos', name='sport_photos'), caption='Фотографии'), item(url(r'^calendar$', 'calendar', name='sport_calendar'), caption='Календарь'), item(url(r'^inbox$', 'inbox', name='sport_inbox'), caption='Входящие', template= 'sport/menu_inbox.html'), item(url(r'^request$', 'create', name='sport_create_request'), caption='Подать заявку'), url(r'^ajax_request$', 'ajax', name='sport_ajax'), )
35 35 {% for item in submenu %} {# права уже проверены #} {{ item }} {% endfor %}
36 36 Пример 6, меню приложений, итоги БылоСтало Много шаблонов с меню Много файлов с url Проверка прав доступа в view Проверка прав доступа в шаблонах Много файлов с url Проверка прав доступа в view Функция регистрации пункта меню Функция выдачи меню в контекст
37 37 Как можно делать новое приложение Проверить, нет ли готовых решений Определить – кто им пользуется из разработчиков – как ему удобнее им пользоваться – какие данные (шаблоны, статические файлы, адреса) потребуются Поместить минимальный набор данных на нужные места Написать приложение под эти данные
38 38 Резюме. Принципы. Не делайте ненужных настроек Настройки должны быть там, где ими пользуются Документация в коде Проект должен собираться автоматически
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.