45
Серверная разработка Сергей Лихобабин Техносфера 2014

Лекция 5 Серверная разработка

Embed Size (px)

DESCRIPTION

Лекция 5 Серверная разработка

Citation preview

Page 1: Лекция 5 Серверная разработка

Серверная разработка

Сергей Лихобабин

Техносфера 2014

Page 2: Лекция 5 Серверная разработка

Что мы научимся делатьОбработка GET и POST запросов

Генерация HTML при помощи шаблонов

Знакомство с Django

Page 3: Лекция 5 Серверная разработка

Типичные задачисерверной разработкиОтображение и изменение(CRUD) объектов насервере

Предоставление API и взаимодействие c APIдругих сервисов

Page 4: Лекция 5 Серверная разработка

Языки сервернойразработки

Компилируемые

C/C++ модули к Web серверам

Java

C#

Page 5: Лекция 5 Серверная разработка

Языки сервернойразработки

Интерпретируемые

Perl

PHP

Ruby

Python

Javascript (NodeJS)

Lua (скриптование веб-серверов)

Page 6: Лекция 5 Серверная разработка

Языки сервернойразработки

Новая волна

Go

Erlang

Scala

Groovy

Page 7: Лекция 5 Серверная разработка

ТенденцииФункциональный подход

Асинхронность

Распределенность

Real-Time

Page 8: Лекция 5 Серверная разработка

Взаимодействие веб-сервера с приложением

CGI

FastCGI

WSGI

Веб-сервер встроенный в приложение

Page 9: Лекция 5 Серверная разработка

CGI #!/usr/bin/python

import osimport sys

print "Content-type: text/html"print "Status: 200"print ""print "<h1>Hello, world!</h1>"

for k, v in os.environ.items(): print "%s = %s<br>" % (k, v)

print >> sys.stderr, "Nice to meet you"

Page 10: Лекция 5 Серверная разработка

Заголовки ответаBooking.com HTTP/1.1 200 OK Server: nginx Date: Sun, 27 Oct 2013 10:08:40 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 42510 Connection: keep-alive Cache-Control: private Vary: User-Agent, Accept-Encoding Content-Encoding: gzip X-Recruiting: Like HTTP headers? Come write ours: booking.com/jobs

Page 11: Лекция 5 Серверная разработка

Заголовки ответаReddit.com HTTP/1.1 200 OKContent-Type: text/html; charset=UTF-8Vary: accept-encodingContent-Encoding: gzipContent-Length: 19879Server: '; DROP TABLE servertypes; --Date: Sun, 27 Oct 2013 10:10:10 GMTConnection: keep-alive

Page 12: Лекция 5 Серверная разработка

GET параметрыГиперссылка <a href="‘/hello.cgi?name=me&greeting=hello’">Hello!</a>

Переменная окружения QUERY_STRING=name=me&greeting=hello

CGI-скрипт import urlparseparams = urlparse.parse_qs('name=me&greeting=hello')

Page 13: Лекция 5 Серверная разработка

POST параметрыФорма <form method="”post”" action="”/hello.cgi”"> <input name="”name”" value="”me”/"> <input name="”greeting”" value="”hi”/"> <input type="”submit”/"></form>

CGI скрипт qs = sys.stdin.read()

или cgi.FieldStorage()

Page 14: Лекция 5 Серверная разработка

Фаилы в POST и Non-ASCII символыMultipart/form-data <form method="”post”" action="”/hello.cgi”" enctype= <input name="”name”" value="”me”/"> <input name="”pic”" type="”file”/"> <input type="”submit”/"></form>

URI encoding <a href="”/hello.cgi?name=%D0%B8%D0%BC%D1%8F”">привет</a>

Page 15: Лекция 5 Серверная разработка

Обработка параметров import cgiform = cgi.FieldStorage()

# Наличие параметровif not 'name' in form: raise ValidationError('panic')# Валидацияif not re.match('[a-z]+', form['name']): raise ValidationError('panic')# Очисткаstory = re.sub('<[̂>]+>', ' ', form['story'])# Экранированиеstory = form['story']story = story.replace('<', '&lt;')story = story.replace('>', '&gt;')

Page 16: Лекция 5 Серверная разработка

Переменные окружения HTTP_COOKIEHTTP_USER_AGENTPATH_INFOQUERY_STRINGREMOTE_ADDRREQUEST_METHODSCRIPT_FILENAMESCRIPT_NAME…

Page 17: Лекция 5 Серверная разработка

WSGI def application(environ, start_response): status = '200 OK' output = 'Hello World!'

response_headers = [ ('Content-type', 'text/plain'), ('Content-Length', str(len(output))) ] start_response(status, response_headers)

return [output]

Page 18: Лекция 5 Серверная разработка

Gunicorn

Page 19: Лекция 5 Серверная разработка

Как запустить gunicorn myproject.wsgi:application

Page 20: Лекция 5 Серверная разработка

АльтернативыuWSGI

Tornado

Werkzeug

Page 21: Лекция 5 Серверная разработка

Решаемыезадачи

Page 22: Лекция 5 Серверная разработка

Обработка форм request = Request(environ)error = Noneurl = ''if request.method == 'POST': url = request.form.get('url') if not is_valid_url(url): error = 'Please enter a valid URL' else: short_id = insert_url(url) return redirect('/%s' % short_id)return render_template('new_url.html', error=error, url=url)

Page 23: Лекция 5 Серверная разработка

Обработка формОтображение формы и изменение через одинобработчик

Сообщение об ошибке и успехе

Проверка данных на сервере и клиенте

Page 24: Лекция 5 Серверная разработка

Ajax Frontend var request = $.ajax({ url: ”/like/", type: "POST", data: {id : itemId}, dataType: "json"}); request.done(function(result) { if (result.status) { $("#log").html( result.msg ); }}); request.fail(function(jqXHR, textStatus) { alert("Request failed: " + textStatus);})

Page 25: Лекция 5 Серверная разработка

Ajax Backend import json

request = Request(environ)

json_data = json.dumps({ 'status': True, 'msg': u'Лайк!'})

response = Response(json_data, mimetype='text/plain')return response(environ, start_response)

Page 26: Лекция 5 Серверная разработка

Хранение данных наклиенте

Что нужно хранить о пользователе

Авторизацию

Временную информацию

Cookie и сессии

Cookie передаются вместе запросом

Сессии хранятся на сервере (в файлах, в базе),идентификатор сессии передаются в куках

Page 27: Лекция 5 Серверная разработка

Cookie ЗаголовкиSet-Cookie: name=val; path=/; domain=domain.ru; expires=Tue, 20 Mar 2012 11:52:54 GMTCookie: name=val;name2=val2;is_visited=2011-13-15

Установкаimport Cookiecookie = Cookie.SimpleCookie()cookie['name'] = 'val'cookie['name']['path'] = '/path'

Получениеcookie.load('a=b;c=d')for name in cookie: print '%s => %s' % (name, cookie[name])

Page 28: Лекция 5 Серверная разработка

Шаблонизаторы '''<html><body> <h1>%s</h1></body></html>’’ % name

VS context = { 'user' : get_user(form['name']), 'friends' : get_friends(form['name']) }

render('tpl/home.html', context)

Page 29: Лекция 5 Серверная разработка

Шаблонизаторы

Page 30: Лекция 5 Серверная разработка

ШаблонизаторыDjango, Jinja2 {% extends "layout.html" %}{% block body %} <ul> {% for user in users %} <li> {% include helper %}</li> {% endfor %} </ul>{% endblock %}

Page 31: Лекция 5 Серверная разработка

SSI <!--# echo var=”Email" default="" -->

<!--# include virtual="/remote/body.php?argument=value" -->

<!--# if expr="$name = /(.+)@(?P<domain>.+)/" --> <!--# echo var="1" --> <!--# echo var="domain" --> <!--# endif -->

Page 32: Лекция 5 Серверная разработка

ФреймворкиГотовая архитектура проекта

Решения для часто-встречающихся задач

Все их используют

Page 33: Лекция 5 Серверная разработка

Flask app = Flask(__name__)

@app.route('/')def index_page(): db = get_db() cur = db.execute('select title, text from entries order by id desc' entries = cur.fetchall() return render_template('show_entries.html', entries=entries)

@app.route('/contact/')def contact_page(): return render_template('contact_page.html')

Page 34: Лекция 5 Серверная разработка

MVC

Page 35: Лекция 5 Серверная разработка

ПримерыPHP - CodeIgniter, Yii

ASP.Net MVC Framework

Perl - Catalyst

Python - Django, Pyramid

Ruby - Ruby on Rails

Page 36: Лекция 5 Серверная разработка

Почему Django?

Page 37: Лекция 5 Серверная разработка

Почему Django?

Page 38: Лекция 5 Серверная разработка

Почему Django?Instagram

40+ миллионов пользователей

100+ виртуальных серверов

1 миллион регистраций за 12 часов послезапуска Android версии

5 разработчиков

Page 39: Лекция 5 Серверная разработка

Почему Django?Pinterest

3 миллиона посетителей в день

4 по популярности в США после Facebook,Twitter, LinkedIn

410 ТБ пользовательских данных

Page 40: Лекция 5 Серверная разработка

Почему Django?Disqus

500 миллионов уникальных посетителей вмесяц

750 тысяч сайтов используют Disqus

165 тысяч сообщений в секунду

8 инженеров-разработчиков

Page 41: Лекция 5 Серверная разработка

Django

Page 42: Лекция 5 Серверная разработка

Возможности фреймворкаГибкая ORM

Интерфейс администрирования

Диспетчер URL на основе регулярныхвыражений

Шаблонизатор

Кэширующий фреймворк

Интернационализация

Обширное комьюнити

Page 43: Лекция 5 Серверная разработка

Структура проектаПроект состоит из приложений

Приложения могут находиться где угодно вPython path

Pluggable-приложения

Page 44: Лекция 5 Серверная разработка

Полезные ссылкиhttp://docs.djangoproject.com/

http://www.djangosites.org/with-source/

https://github.com/django/django

Page 45: Лекция 5 Серверная разработка

Спасибо за внимание

Сергей Лихобабин

[email protected]