Django полезные советы
Полезные советы новичкам:
1. Не указывайте имя проекта в импорте Предположим что у вас есть приложение "vasya" в проекте "my" не указывайте следующим образом
from my.vasya.models import Hero
Вы не сможете повторно использовать это приложение, а сменить имя проекта будет сущей проблемой. Сделайте так:
from vasya.models import Hero
Ну а для сохранения работоспособности необходимо добавить в пути питона директорию вашего проложения следующим образом:
import syssys.path.insert(0, <путь к папкам app>)
Не программируйте жестко пути MEDIA_ROOT и TEMPLATE_DIRS Не присваивайте следующим образом параметры MEDIA_ROOT и TEMPLATE_DIRS в файле setting.py:
TEMPLATE_DIRS = ( "/home/html/project/templates",)MEDIA_ROOT = "/home/html/project/appmedia/"
Это вызовет много проблем при переносе проекта на другую операционную систему.
Используя следующую технику вы легко сможете обойти эту проблему:
SITE_ROOT = os.path.realpath(os.path.dirname(__file__))MEDIA_ROOT = os.path.join(SITE_ROOT, 'appmedia')TEMPLATE_DIRS = ( os.path.join(SITE_ROOT, 'templates'),)
Техника от Rob Hudson, детальная инфомация по следующей ссылке.
Не программируйте жестко пути к статическим файлам
Когда вам нужно сделать ссылку на статические ресурсы(javascript, css, картинки) не пользуйтесь следующим способом (MEDIA_URL = “/appmedia/”):
<link rel="stylesheet" type="text/css" href="/appmedia/wysiwyg/jHtmlArea.css" /><script type="text/javascript" src="/appmedia/wysiwyg/jHtmlArea.js"> </script>
Проблема появится тогда, когда вы захотите перенести статические ресурсы на другой сервер. Избавится от нее вам поможет использование переменной Шаблон:MEDIA URL которой необходимо присвоить значение "/appmedia/" в файле settings.py:
<link rel="stylesheet" type="text/css" href="Шаблон:MEDIA URLwysiwyg/jHtmlArea.css" /><script type="text/javascript" src="Шаблон:MEDIA URLwysiwyg/jHtmlArea.js"></script>
А как же получить переменные окружения(сontext variable)?
Просто :). Что бы добавить переменные(например, пользователя или запрашиваемую страницу) в шаблон воспользуйтесь добавлением RequestContext(request) в метод render_to_response:
return render_to_response("my_app/my_template.html", {'some_var': 'foo'}, context_instance=RequestContext(request))
Подробная информация.
Не пишите бизнес логику в функциях представлений
Не очень хорошая идея писать бизнес логику в представлениях (например, логика добавляющая сумму P на ваш банковский счет X, и отнимающая P с вашего счета Y.)
Вы спросите почему? 1. Нет возможности написать unit тесты. 2. Нет возможности повторного использования кода.
Так куда помещать такую логику? Хорошей идеей будет поместить ее в модель или в дополнительную функцию.
Менять DEBUG=False при переносе версии на рабочий сайт нудно Часто мы забываем изменить DEBUG на значение False при переносе вернии на рабочий сайт. Да и нужно это.
Исправить эту ситуацию можно 2-я способами: 1. Проверять на имя домена следующим образом:
import socketif socket.gethostname() == 'productionserver.com': DEBUG = Falseelse: DEBUG = True
Первым озвучил ее Jokull. Подробнаи информация.
2. Использовать дополнительный файл конфигурации для локальной среды разработки, в котором и можно переопределить все дополнительные параметры.
#Filename settings_debuy.py#It contains all variables from settings and it overrides the DEBUG variable to True#we use settings_debug.py to run the server locally python manage.py runserver settings=settings_debug.pyfrom settings import *DEBUG = True#you can also add other things which helps you to do the debugging easily#like Debug toolbar etc...
Детальная информация
Загружать теги шаблонов сторонних приложений один раз Перед использованием тегов в шаблонах необходимо сделать:
{% load template_tags %}
Данный код мы должны прописать в каждом шаблоне в котором мы хотим использовать данные теги. Исправить это мы можем добавив следующий код:
from django import templatetemplate.add_to_builtins('project.app.templatetags.custom_tag_module')
Поместите этот код в любой файл который загружается на старте приложения(settings.py,urls.py,любой файл models.py в приложениях). Это позволит использовать данные теги без объявления загрузок в шаблонах.
Urls.py
Не описывайте все вашии урлы в project/urls.py
urlpatterns = patterns(, url(r'^askalumini/question/$','.....registerInstitution',name='iregister'), url(r'^askalumin/answer /$','someview.....',name='newmemberurl'), url(r'^institution/member/$','someview.....',name="dashboardurl"), url(r'^institution/faculty /$','editInstitute',name="editinstituteurl"), url(r'^memeber/editprofile/$','editProfile',name="editprofileurl"), url(r'^member/changepassword /$','changePassword',name="changepasswordurl"), url(r'^member/forgotpassword /$','forgotPassword',name="forgotpasswordurl"), url(r'^member/changepicture/$','changePicture',name="changepictureurl"), url(r'^member/logout /$','memeberlogout',name="logouturl"), ,)
Следующий код позволить вам реализовывать приложения многократно. В файле project/urls.py описываем следующим образом:
urlpatterns = patterns(, # Example: (r'^$', include('institution.urls')), (r'^institution/', include('institution.urls')), (r'^askalumini/', include('askalumini.urls')), (r'^member/', include('member.urls')),)
а в каждом приложении так же создайте файлы urls.py и пропишите соответствующие url-ы в каждом из них(пример для приложения askalumini)
urlpatterns = patterns('askalumini.views', url(r'^$','askHome',name='askaluminiurl'), url(r'^questions/(?P\d+)/$','displayQuestion', name= 'askquestiondisplay'), url(r'^askquestions/$','askQuestion',name='askquestionurl'), url(r'^postcomment/$','postComment',name="askquestioncomment")
Используйте наименование Url-ов для идентификации При описании урлов мы указали параметр name. Данное наименование поможет разумно формировать url в моделях, представлениях и шаблонах. Не программируйте жестко url-ы Почему?
Если вы измените структуру урлов в файле url.py вам понадобится сделать такие же изменения во всех местах где они были использованы. view.py Вместо того что бы жестко прописать урл следующим образом
HttpResponseRedirect("/askalumini/questions/54")
используйте функцию reverse
from django.core.urlresolvers import reverseHttpResponseRedirect(reverse('askquestiondisplay',kwargs{'questionno':q.id}))
models.py В файле models.py к дополнению функции reverse вы также можете использовать models.permalink декоратор.
@models.permalinkdef get_absolute_url(self): return ('profileurl2',(),{'userid': self.user.id})
Такой декоратор также использует имя для формирования урла.
templates.py
В шаблонах вы можете воспользоваться тегом url
{% url askquestiondisplay 345 %} Ask Question
Отладка а) Воспользуйтесь django-debug-toolbar для доступа к следующей информации: 1. Сколько sql запросов выполняется? За какое время? 2. Имя шаблона, логгирование, куки/сессия и т.д. Описание всех возможностей можно найти по следующей ссылке
б) Воспользуйтесь отладчиком Werkzeug, который позволит открыть консоль python-а на странице отображения ошибки и поможет быстро найти ошибку. Детальная информация
в) Используйте полезной утилитой для отладки, pdb.
Если знаете про Pinax используйте его Django способствует повторному использованию приложений. Pinax - проект который включает уже инфраструктуру повторно используемых приложений. В одно время я попытался его использовать так как есть. Интересное интеграционное решение, являющееся деревом разнообразных многократно используемых проектов. Не понравилось только то, что этим "ящиком с приложениями" тяжело управлять. Попробуйте исключить пару ненужных модулей и сразу будет понятно, что все же интеграция получилась слишком тесной.
Для более детальной информации обратитесь на сайт разработчиков http://pinaxproject.com/. Необходимо знать и о других приложениях 1. Миграция Как изменять версию приложения/БД на сайте при появлении следующих версий проекта в котором уже изменилась структура приложения/БД? Этот процесс и называется миграцией. Есть несколько приложений которые вам помогут в этом:
- django-evolutions - легкая в использовании, все делает автоматически, но не надежна - South - более надежна, но необходимо будет разбираться.
2. Шаблоны Если вы считаете что язык шаблонов Django очень узкий тогда вы можете воспользоваться следующими:
- template-utils - Jinja
3. Другие приложения
- django command extensions - Sorl
статья автора: [1]http://night-fairy-tales.com/2009/09/django.html