SlideShare a Scribd company logo
AJAX
Asynchronous JavaScript And XML
AJAX - технология загрузки данных / отправки форм без
обновления WEB страницы.
XML - совершенно не обязателен, возможны отправка и прием
данных любого типа. Чаще всего вместо XML используется HTML
либо JSON для загрузки сырых данных.
2
AJAX на стороне клиента
var xhr = new XMLHttpRequest();
xhr.open('POST', '/xhr/test.html', true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
alert(xhr.responseText);
}
}
};
xhr.send("a=5&b=4");
3
AJAX при помощи jQuery
$.ajax({
url: '/blog/comments/add/',
type: 'POST',
data: { post_id: 12, text: 'Занятная идея!' },
}).success(function(data) {
if (data.status == 'ok') {
console.log(data.comment_id);
}
}).error(function() {
console.log('http error')
});
4
Особенности и ограничения AJAX
•   Same Origin Policy - AJAX запросы можно отправлять только на
свой домен. В современных браузерах есть CORS.
•   Т.к. данные передаются явно в метод send , то нельзя загружать
файлы. В HTML5 есть FormData.
•   AJAX на стороне сервера не отличим от обычного запроса. jQuery
добавляет заголовок X-Requested-With: XMLHttpRequest
•   Результаты запроса передаются в JavaScript функцию поэтому
стандартные методы обработки ошибок - не работают.
5
Загрузка HTML данных
def comments_list(request):
post_id = request.GET.get('post_id')
post = get_object_or_404(Post, post_id)
comments = paginate(request, post.comments)
return render(request, 'blog/comments.html', {
'comments': comments
})
В blog/comments.html отображается только HTML код
комментариев, без окружающей страницы.
6
Обмен данными в JSON
{
"status": "ok",
"comment_id": 123
}
{
"status": "error",
"code": "no_auth",
"message":"вы не авторизованы"
}
7
HttpResponseAjax
import json
class HttpResponseAjax(HttpResponse):
def __init__(self, status='ok', **kwargs):
kwargs['status'] = status
super(HttpResponseAjax, self).__init__(
content = json.dumps(kwargs),
content_type = 'application/json',
)
class HttpResponseAjaxError(HttpResponseAjax):
def __init__(self, code, message):
super(HttpResponseAjaxError, self).__init__(
status = 'error', code = code, message = message
)
8
Использование HttpResponseAjax
@login_required_ajax
def comment_add(request):
form = AddCommentForm(request.POST)
if form.is_valid():
comment = form.save()
return HttpResponseAjax(comment_id=comment.id)
else:
return HttpResponseAjaxError(
code = "bad_params",
message = form.errors.as_text(),
)
9
Проверка авторизации в AJAX
def login_required_ajax(view):
def view2(request, *args, **kwargs):
if request.user.is_authenticated():
return view(request, *args, **kwargs)
elif request.is_ajax():
return HttpResponseAjaxError(
code = "no_auth",
message = u'Требуется авторизация',
)
else:
redirect('/login/?continue=' + request.get_full_path())
return view2
10
CORS
Cross Origin Resource Sharing
Браузер выполняет AJAX запросы даже к чужому домену, но в этом
случае не вызывает функцию-callback в JavaScript, т.е. не дает
использовать данные, загруженные с чужого домена.
CORS позволяет серверу явно разрешить использование данных
при кросс-доменных запросах.
12
Cross Origin Resource Sharing
13
Заголовки CORS
•   Origin - указывает URL запрашивающего приложения
•   Access-Control-Allow-Origin: origin - разрешает
использовать данные в кросс-доменном запросе. origin должен
либо совпадать с загловком Origin в запросе, либо * .
•   Access-Control-Allow-Credentials - позволяет использовать
данные, если были переданы cookies.
14
Использование CORS
Не следует разрешать CORS для всех запросов ( * ).
Хорошей практикой является:
•   Проверка суффикса домена
•   Проверка домена по списку доверенных
15
CORS на клиенте
$.ajax({
url: 'https://site.com/blog/comments/add/',
type: 'POST',
data: { post_id: 12, text: 'Занятная идея!' },
crossDomain: true,
xhrFields: {
withCredentials: true
}
}).success(function(data) {
// ...
});
16
CORS на сервере
def allow_cors(view):
def view2(request, *args, **kwargs):
response = view(request, *args, **kwargs)
origin = request.META.get('HTTP_ORIGIN')
if not origin:
return response
for domain in settings.CORS_WHITE_LIST:
if origin.endswith('.' + domain):
response['Access-Control-Allow-Origin'] = origin
return response
return view2
17

More Related Content

PPT
Web весна 2013 лекция 9
PPT
Top 10 problems supporting Magento customers
PDF
Максим Ширшин "SVARX, или Борьба с большими формами"
PPTX
Selenium: начало работы
PDF
Продвинутое использование ActiveRecord в Yii2
PPTX
Selenium: приемы работы
PPTX
Web осень 2013 лекция 7
PDF
«Highload блоки и новое api к ним»
Web весна 2013 лекция 9
Top 10 problems supporting Magento customers
Максим Ширшин "SVARX, или Борьба с большими формами"
Selenium: начало работы
Продвинутое использование ActiveRecord в Yii2
Selenium: приемы работы
Web осень 2013 лекция 7
«Highload блоки и новое api к ним»

What's hot (19)

PDF
YiiConf: Миграции и инсталляции
PDF
QA Fest 2019. Андрей Солнцев. Selenide для профи
PPTX
Коротко о React.js
PDF
Изоморфные приложения и Python - Виталий Глибин, Huntflow
PDF
JavaScript Базовый. Занятие 07.
PPTX
Web осень 2013 лекция 8
PPTX
XPath локаторы в Selenium WebDriver
PPTX
работа сайта
PPTX
Человекопонятные отчёты
PPT
Руководство по приготовлению бутербродов из Selenium
PPT
Общая архитектура Yii2
PPT
Подробная презентация JavaScript 6 в 1
PDF
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
PPTX
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
PDF
11 - Web-технологии. Работа с СУБД
PPTX
Как мы документируем программные интерфейсы. YaC 2014
PDF
JavaScript Базовый. Занятие 10.
PDF
Web internship java script
PDF
10 - Web-технологии. MVC фреймворки (продолжение)
YiiConf: Миграции и инсталляции
QA Fest 2019. Андрей Солнцев. Selenide для профи
Коротко о React.js
Изоморфные приложения и Python - Виталий Глибин, Huntflow
JavaScript Базовый. Занятие 07.
Web осень 2013 лекция 8
XPath локаторы в Selenium WebDriver
работа сайта
Человекопонятные отчёты
Руководство по приготовлению бутербродов из Selenium
Общая архитектура Yii2
Подробная презентация JavaScript 6 в 1
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
11 - Web-технологии. Работа с СУБД
Как мы документируем программные интерфейсы. YaC 2014
JavaScript Базовый. Занятие 10.
Web internship java script
10 - Web-технологии. MVC фреймворки (продолжение)
Ad

Viewers also liked (18)

PDF
14 - Web-технологии. Обработка форм
PDF
15 - Web-технологии. Сессии и авторизация
PDF
17 - Web-технологии. Real Time сообщения
PDF
12 - Web-технологии. Django модели
PDF
09 - Web-технологии. MVC фреймворки
PDF
13 - Web-технологии. Отображение данных
PDF
01 - Системные требования
PDF
02 - Установка macOS
PDF
03 - Установка Xcode
PDF
02 - Web-технологии. Web-клиенты
PDF
01 - Web-технологии. Архитектура Web приложений
PDF
07 - Web-технологии. Web-сервера
PDF
04 - Практика UML. Описание прецедентов
PDF
Практический анализ и визуальное моделирование на UML
PDF
08 - Web-технологии. Архитектура frontend-backend
PDF
66 - Spring. Spring и JSF
PDF
05 - Web-технологии. Сетевые протоколы
PDF
06 - Web-технологии. Протокол HTTP
14 - Web-технологии. Обработка форм
15 - Web-технологии. Сессии и авторизация
17 - Web-технологии. Real Time сообщения
12 - Web-технологии. Django модели
09 - Web-технологии. MVC фреймворки
13 - Web-технологии. Отображение данных
01 - Системные требования
02 - Установка macOS
03 - Установка Xcode
02 - Web-технологии. Web-клиенты
01 - Web-технологии. Архитектура Web приложений
07 - Web-технологии. Web-сервера
04 - Практика UML. Описание прецедентов
Практический анализ и визуальное моделирование на UML
08 - Web-технологии. Архитектура frontend-backend
66 - Spring. Spring и JSF
05 - Web-технологии. Сетевые протоколы
06 - Web-технологии. Протокол HTTP
Ad

Similar to 16 - Web-технологии. Технология AJAX (20)

PPTX
course js day 4
PDF
JS утиліти WordPress на практиці
PDF
Mihail davidov js-ajax
PPT
Web весна 2012 лекция 9
PDF
Михаил Давыдов — Транспорт, Ajax
PDF
Михаил Давыдов — JavaScript: Асинхронность
PDF
Михаил Давыдов - JavaScript. Асинхронность
PPT
Web осень 2012 лекция 4
PPTX
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
PPTX
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
PDF
Jsfwdays 2013-2
PDF
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
PPT
Web весна 2013 лекция 4
PDF
JavaScript Базовый. Занятие 08.
PDF
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
PPTX
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
PDF
Организация работы с API на Vue.js, Виталий Копачёв
PDF
Асинхронный JavaScript
PPT
Js Http Request дмитрий котеров
PPT
course js day 4
JS утиліти WordPress на практиці
Mihail davidov js-ajax
Web весна 2012 лекция 9
Михаил Давыдов — Транспорт, Ajax
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
Web осень 2012 лекция 4
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Jsfwdays 2013-2
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
Web весна 2013 лекция 4
JavaScript Базовый. Занятие 08.
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
Организация работы с API на Vue.js, Виталий Копачёв
Асинхронный JavaScript
Js Http Request дмитрий котеров

More from Roman Brovko (20)

PDF
Individual task Networking
PPTX
Networking essentials lect3
PPTX
Gl embedded starterkit_ethernet
PPTX
Networking essentials lect2
PPTX
Networking essentials lect1
PPTX
Bare metal training_07_spi_flash
PPTX
Bare metal training_06_I2C
PPTX
Glesk worshop
PPTX
Bare metal training_05_uart
PPTX
Bare metal training_04_adc_temp_sensor
PPTX
Bare metal training_03_timers_pwm
PPTX
Bare metal training_02_le_ds_and_buttons
PPTX
Bare metal training_01_hello_world
PPTX
Bare metal training_00_prerequisites
PPTX
C language lect_23_advanced
PPTX
C language lect_22_advanced
PPTX
C language lect_21_advanced
PPTX
подготовка рабочего окружения
PPTX
C language lect_20_advanced
PPTX
C language lect_19_basics
Individual task Networking
Networking essentials lect3
Gl embedded starterkit_ethernet
Networking essentials lect2
Networking essentials lect1
Bare metal training_07_spi_flash
Bare metal training_06_I2C
Glesk worshop
Bare metal training_05_uart
Bare metal training_04_adc_temp_sensor
Bare metal training_03_timers_pwm
Bare metal training_02_le_ds_and_buttons
Bare metal training_01_hello_world
Bare metal training_00_prerequisites
C language lect_23_advanced
C language lect_22_advanced
C language lect_21_advanced
подготовка рабочего окружения
C language lect_20_advanced
C language lect_19_basics

16 - Web-технологии. Технология AJAX

  • 2. Asynchronous JavaScript And XML AJAX - технология загрузки данных / отправки форм без обновления WEB страницы. XML - совершенно не обязателен, возможны отправка и прием данных любого типа. Чаще всего вместо XML используется HTML либо JSON для загрузки сырых данных. 2
  • 3. AJAX на стороне клиента var xhr = new XMLHttpRequest(); xhr.open('POST', '/xhr/test.html', true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { alert(xhr.responseText); } } }; xhr.send("a=5&b=4"); 3
  • 4. AJAX при помощи jQuery $.ajax({ url: '/blog/comments/add/', type: 'POST', data: { post_id: 12, text: 'Занятная идея!' }, }).success(function(data) { if (data.status == 'ok') { console.log(data.comment_id); } }).error(function() { console.log('http error') }); 4
  • 5. Особенности и ограничения AJAX •   Same Origin Policy - AJAX запросы можно отправлять только на свой домен. В современных браузерах есть CORS. •   Т.к. данные передаются явно в метод send , то нельзя загружать файлы. В HTML5 есть FormData. •   AJAX на стороне сервера не отличим от обычного запроса. jQuery добавляет заголовок X-Requested-With: XMLHttpRequest •   Результаты запроса передаются в JavaScript функцию поэтому стандартные методы обработки ошибок - не работают. 5
  • 6. Загрузка HTML данных def comments_list(request): post_id = request.GET.get('post_id') post = get_object_or_404(Post, post_id) comments = paginate(request, post.comments) return render(request, 'blog/comments.html', { 'comments': comments }) В blog/comments.html отображается только HTML код комментариев, без окружающей страницы. 6
  • 7. Обмен данными в JSON { "status": "ok", "comment_id": 123 } { "status": "error", "code": "no_auth", "message":"вы не авторизованы" } 7
  • 8. HttpResponseAjax import json class HttpResponseAjax(HttpResponse): def __init__(self, status='ok', **kwargs): kwargs['status'] = status super(HttpResponseAjax, self).__init__( content = json.dumps(kwargs), content_type = 'application/json', ) class HttpResponseAjaxError(HttpResponseAjax): def __init__(self, code, message): super(HttpResponseAjaxError, self).__init__( status = 'error', code = code, message = message ) 8
  • 9. Использование HttpResponseAjax @login_required_ajax def comment_add(request): form = AddCommentForm(request.POST) if form.is_valid(): comment = form.save() return HttpResponseAjax(comment_id=comment.id) else: return HttpResponseAjaxError( code = "bad_params", message = form.errors.as_text(), ) 9
  • 10. Проверка авторизации в AJAX def login_required_ajax(view): def view2(request, *args, **kwargs): if request.user.is_authenticated(): return view(request, *args, **kwargs) elif request.is_ajax(): return HttpResponseAjaxError( code = "no_auth", message = u'Требуется авторизация', ) else: redirect('/login/?continue=' + request.get_full_path()) return view2 10
  • 11. CORS
  • 12. Cross Origin Resource Sharing Браузер выполняет AJAX запросы даже к чужому домену, но в этом случае не вызывает функцию-callback в JavaScript, т.е. не дает использовать данные, загруженные с чужого домена. CORS позволяет серверу явно разрешить использование данных при кросс-доменных запросах. 12
  • 13. Cross Origin Resource Sharing 13
  • 14. Заголовки CORS •   Origin - указывает URL запрашивающего приложения •   Access-Control-Allow-Origin: origin - разрешает использовать данные в кросс-доменном запросе. origin должен либо совпадать с загловком Origin в запросе, либо * . •   Access-Control-Allow-Credentials - позволяет использовать данные, если были переданы cookies. 14
  • 15. Использование CORS Не следует разрешать CORS для всех запросов ( * ). Хорошей практикой является: •   Проверка суффикса домена •   Проверка домена по списку доверенных 15
  • 16. CORS на клиенте $.ajax({ url: 'https://site.com/blog/comments/add/', type: 'POST', data: { post_id: 12, text: 'Занятная идея!' }, crossDomain: true, xhrFields: { withCredentials: true } }).success(function(data) { // ... }); 16
  • 17. CORS на сервере def allow_cors(view): def view2(request, *args, **kwargs): response = view(request, *args, **kwargs) origin = request.META.get('HTTP_ORIGIN') if not origin: return response for domain in settings.CORS_WHITE_LIST: if origin.endswith('.' + domain): response['Access-Control-Allow-Origin'] = origin return response return view2 17