More Related Content Similar to Web осень 2013 лекция 5 Similar to Web осень 2013 лекция 5 (20) More from Technopark (20) Web осень 2013 лекция 52. Сепвепмая пазпабнсйа
Чсн лы матцилря декась?
• Обпабасъвасы GET и POST заопнръ
• Въвндисы HTML опи онлнши чабкнмнв
• Пнзмайнлилрю р Django
Тиоицмые задаци репвепмнй пазпабнсйи
• Оснбпажемие нбщейснв (роирйи, оагимахию, рспамихъ
нбщейснв)
• Излемемие нбщейснв (CRUD)
• Взаилндейрсвие р онкызнвасекел (унплъ, wizard)
2
3. Языйи дкя репвепмнй пазпабнсйи
Йнлоикиптелые:
• С/С++ лндтки й Web репвепал
• Java (Tomcat, Jetty)
Имсепопесиптелые:
• Perl – CGI, mod_perl, PSGI
• PHP – mod_php, FastCGI (FPM)
• Ruby – Rack (mongrel)
• Python – WSGI (Tornado)
• JavaScript (NodeJS)
3
5. Ппнснйнк CGI
#!/usr/bin/python
import os
import sys
print
print
print
print
"Content-type: text/html"
"Status: 200"
""
"<h1>Hello, world!</h1>"
for k, v in os.environ.items():
print "%s = %s<br>" % (k, v)
print >> sys.stderr, "Nice to meet you"
5
7. Загнкнвйи нсвеса
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
7
8. Загнкнвйи нсвеса
Reddit.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Vary: accept-encoding
Content-Encoding: gzip
Content-Length: 19879
Server: '; DROP TABLE servertypes; -Date: Sun, 27 Oct 2013 10:10:10 GMT
Connection: keep-alive
8
10. 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()
10
11. Файкы и ме-ASCII
multipart/form-data
<form method=”post” action=”/hello.cgi” enctype=”multipart/formdata”>
<input name=”name” value=”me”/>
<input name=”pic” type=”file”/>
<input type=”submit”/>
</form>
URI percent encoding
<a href=”/hello.cgi?name=%D0%B8%D0%BC%D1%8F”>опивес</a>
11
12. Обпабнсйа оапалеспнв
import cgi
form = 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('<', '<')
story = story.replace('>', '>')
12
15. Ппнснйнк 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]
15
17. Werkzeug
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
text = 'Hello %s!' %
request.args.get('name', 'World')
response =
Response(text, mimetype='text/plain')
return response(environ, start_response)
17
18. Werkzeug Middleware
from werkzeug.wsgi import DispatcherMiddleware
app = DispatcherMiddleware(app, {
'/app2': app2,
'/app3': app3
})
from werkzeug.debug import DebuggedApplication
app = DebuggedApplication(app)
18
19. Йай заотрсись?
<VirtualHost *>
ServerName example.com
WSGIScriptAlias /myapp /usr/local/www/wsgiscripts/myapp.wsgi
WSGIDaemonProcess example.com processes=2
threads=15
WSGIProcessGroup example.com
<Directory /usr/local/www/wsgi-scripts>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
19
22. Обпабнсйа унпл
request = Request(environ)
error = None
url = ''
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=ur
l)
22
23. Обпабнсйа унпл
1. Одим нбпабнсций дкю нснбпажемию и излемемию нбщейса
2. Сннбшемие нб нчибйе и троефе
3. Ппнвепйа даммъф ма репвепе и йкиемсе
4. Редипейс онрке въонкмемию дейрсвию
23
25. 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);
});
25
26. Ajax Backend
Загнкнвнй X-Requested-with дкя AJAX заопнрнв
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)
26
27. Хпамемие даммыф ма йкиемсе
Чсн мтжмн фпамись н онкьзнвасеке?
Пнкызнвасекырйие марспнййи
Впелеммтэ имунплахиэ
Авснпизнвам ки онкызнвасекы
Cookie и реррии
Cookie оепедаэсрю влерсе заопнрнл
Серрии фпамюсрю ма репвепе (в уайкаф, в базе), идемсиуийаснп
реррии оепедаэсрю в йтйаф
27
28. Cookie и реррии
Cеррии
бнкее топавкюелъе (лнжмн рбпнрисы)
рмилаэс нгпамицемие ма пазлеп
спебтэс онддепжйи бьйемда
лнгтс възъвасы опнбкелъ опи върнйиф магптзйаф
Cookie
Огпамицемию ма пазлеп и йнкицерсвн
опайсицерйи ме топавкюелъе
оепедаэсрю он реси р йаждъл заопнрнл
28
29. Cookie
Загнкнвйи
Set-Cookie: name=val; path=/; domain=domain.ru;
expires=Tue, 20 Mar 2012 11:52:54 GMT
Cookie: name=val;name2=val2;is_visited=2011-13-15
Урсамнвйа
import Cookie
cookie = 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])
29
32. Шабкнмизаснпы
Jinja2 ~ Django
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li> {% include helper %}</li>
{% endfor %}
</ul>
{% endblock %}
32
33. SSI
<!--# echo var=”Email" default="" -->
<!--# include
virtual="/remote/body.php?argument=value" -->
<!--#
->
<!--#
<!--#
<!--#
if expr="$name = /(.+)@(?P<domain>.+)/" echo var="1" -->
echo var="domain" -->
endif -->
33
35. Гнснваю апфисейстпа опнейса
Эйнмнлию пертпрнв
Уцарсие в Open Source опнейсаф
Вре иф иронкызтэс
35
37. 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=entrie
s)
@app.route('/contact/')
def contact_page():
return render_template('contact_page.html')
37
38. MVC
Model-view-controller – рфела иронкызнвамию мерйнкыйиф
чабкнмнв опнейсипнвамию, р онлншыэ йнснпъф лндекы даммъф
опикнжемию, онкызнвасекырйий имсепуейр и взаилндейрсвие р
онкызнвасекел паздекемъ ма спи нсдекымъф йнлонмемса сай, цсн
лндиуийахию ндмнгн из йнлонмемснв нйазъваес лимилакымне
внздейрсвие ма нрсакымъе.
38
40. • PHP (CodeIgniter, Yii)
• ASP (ASP.NET MVC Framework)
• Perl (Catalyst)
• Python (Django, Pyramid)
• Ruby (Ruby on Rails)
40
43. Instagram
40+ ликкинмнв онкызнвасекей
100+ випстакымъф репвепнв в EC2
Ппнейс йтокем Facebook за 1 лкпд. днкк
1 ликкинм пегирспахий за 12 царнв онрке заотрйа Androidвеприи
5 пазпабнсцийнв
43
44. Pinterest
3 ликкинма тмийакымъф онресисекей в демы
18 ликкинмнв тмийакымъф онресисекей в лерюх
4-ю он оноткюпмнрси рнхиакымаю ресы в США онрке
Facebook, Twitter и LinkedIn
410Тб онкызнвасекырйиф даммъф
44
45. Disqus
500 ликкинмнв тмийакымъф онресисекей в лерюх
750 сърюц райснв иронкызтэс Disqus
1,5 ликкинма ндмнвпелеммъф онкызнвасекей
165 сърюц рннбшемий в рейтмдт
8 имжемепнв-пазпабнсцийнв
45
48. Внзлнжмнрси
Гибйаю ORM
Легйн марспаиваелъй имсепуейр адлимирспаснпа
Дироесцеп тпкнв ма нрмнве пегткюпмъф въпажемий
Наркеднвамие чабкнмнв
Кечиптэший упейлвнпй
Имсепмахинмакизахию
Шабкнмъ утмйхий йнмспнккепа
Community
48
49. Ппикнжемия
Ппнейс рнрснис из мерйнкыйиф опикнжемий
Мнгтс кежасы в кэбнл лерсе PythonPath
Мнгтс иронкызнвасырю пазмъли опнейсали
Ппикнжемие – паздек райса кибн рйвнзмнй утмйхинмак
49