Django+ajax=dajax. Простая в использовании ajax библиотека django
Django+ajax=dajax. Простая в использовании ajax библиотека django. Введение
Сегодня хочу рассказать о замечательной и малоизвестной ajax библиотеке django. Думаю, что каждый django-разработчик, потратил не мало времени на то, чтобы разобраться с ajax в django. Лично мне не понравились все мануалы, которые я прочитал да и способы были не очень удобными, поэтому я продолжил свои поиски и в один прекрасный момент я наткнулся на www.dajaxproject.com. Оказалось, что библиотека dajax позволяет использовать ajax, столь же просто, сколько и писать на django.
Внутренности dajaxproject
Сама библиотека состоит из двух частей dajaxice и dajax.
Dajaxice
Dajaxice, является чем-то вроде мостика, ее основной целью, является взаимодействие кода, находящегося на стороне сервера с вашим javascript-кодом. Вот так это отображено на сайте разработчика:
Как видно на данной схеме, dajaxice используется и на стороне сервера и на стороне клиента, что я и описал выше.
Dajax
Dajax — это очень простая библиотека для разработки асинхронной логики в ваших web-приложениях, с почти полным отсутствием javascript.
Установка
Скачиваем Dajaxice и Dajax, не забудьте, что главное здесь Dajaxice, поэтому он обязателен.
Распаковываем и устанавливаем.
Использование dajaxice
settings.py
Добавляем в INSTALLED_APPS dajaxice:
1 2 3 4 5 6 7 8 | INSTALLED_APPS = ( 'django.contrib.auth' , 'django.contrib.contenttypes' , 'django.contrib.sessions' , 'django.contrib.sites' , 'dajaxice' , ... ) |
Проверяем, чтобы TEMPLATE_LOADERS выглядели следующим образом:
1 2 3 4 5 | TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader' , 'django.template.loaders.app_directories.Loader' , 'django.template.loaders.eggs.Loader' , ) |
Так же, TEMPLATE_CONTEXT_PROCESSORS:
1 2 3 4 5 6 7 | TEMPLATE_CONTEXT_PROCESSORS = ( "django.contrib.auth.context_processors.auth" , "django.core.context_processors.debug" , "django.core.context_processors.i18n" , "django.core.context_processors.media" , "django.core.context_processors.static" , "django.core.context_processors.request" , "django.contrib.messages.context_processors.messages" ) |
Далее необходимо добавить DAJAXICE_MEDIA_PREFIX:
1 | DAJAXICE_MEDIA_PREFIX = "dajaxice" |
Регистрируем функции, чтобы их было возможно использовать из javascript:
1 2 | DAJAX_FUNCTIONS = ( 'examples.ajax.dajaxice_example' , |
- В данном случае examples — название нашего приложения;
- ajax — файл в котором хранятся наши функции(у нас ajax.py). При вызове функций, название файла указывать не надо;
- dajaxice_example — функция которую мы и будем вызывать.
urls.py
Добавляем импорт:
1 2 | from dajaxice.core import dajaxice_autodiscover dajaxice_autodiscover() |
Новая строчка в urlpatterns:
1 | (r '^%s/' % settings.DAJAXICE_MEDIA_PREFIX, include( 'dajaxice.urls' )), |
Возможно потребуется добавить импорт для view:
1 | from django.conf import settings |
index.html
На нашу страничку необходимо добавить следующее:
1 2 3 4 5 6 7 | { % load dajaxice_templatetags % } My base template ... { % dajaxice_js_import % } ... |
На этом наша настройка завершена и мы можем приступать к написанию первого приложения, с использованием dajaxice.
Как мама мыла мерс
Итак для начала надо создать файл ajax.py в нашем приложении.
Содержимое файла:
1 2 3 4 5 6 7 | #-*-coding:utf-8-*- from django.utils import simplejson from dajaxice.decorators import dajaxice_register @dajaxice_register def dajaxice_example(request): return simplejson.dumps({ 'message' :u 'Мама мыла мерс!' }) |
Если кому-то не нравятся декораторы, то их можно заменить на:
1 2 3 4 5 6 7 | from django.utils import simplejson from dajaxice.core import dajaxice_functions def myexample(request): return simplejson.dumps({ 'message' : 'Мама мыла мерс!' }) dajaxice_functions.register(myexample) |
На веб-странице:
1 2 | < input type = "button" name = "rand" value = "Get message from server!" id = "rand" onclick = "Dajaxice.examples.dajaxice_example(my_callback)" > |
Помните, я говорил, что при вызове функции указывать имя файла не надо? Вот здесь это хорошо видно.
В более ранних версиях функция my_callback должна была указываться, как строка, сейчас по соображениям безопасности это выглядит так.
И сам javascript:
1 2 3 | function my_callback(data){ alert(data.message); } |
Введение в технологию dajaxice, закончено. Если будет интересно, в дальнейшем я расскажу как писал календарь с использованием djaxice и непосредственно об использовании dajax.