Web осень 2013 лекция 5

726 views
646 views

Published on

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
726
On SlideShare
0
From Embeds
0
Number of Embeds
195
Actions
Shares
0
Downloads
49
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Web осень 2013 лекция 5

  1. 1. Сепвепмая пазпабнсйа Акейрамдп Бейбткаснв
  2. 2. Сепвепмая пазпабнсйа Чсн лы матцилря декась? • Обпабасъвасы GET и POST заопнръ • Въвндисы HTML опи онлнши чабкнмнв • Пнзмайнлилрю р Django Тиоицмые задаци репвепмнй пазпабнсйи • Оснбпажемие нбщейснв (роирйи, оагимахию, рспамихъ нбщейснв) • Излемемие нбщейснв (CRUD) • Взаилндейрсвие р онкызнвасекел (унплъ, wizard) 2
  3. 3. Языйи дкя репвепмнй пазпабнсйи Йнлоикиптелые: • С/С++ лндтки й Web репвепал • Java (Tomcat, Jetty) Имсепопесиптелые: • Perl – CGI, mod_perl, PSGI • PHP – mod_php, FastCGI (FPM) • Ruby – Rack (mongrel) • Python – WSGI (Tornado) • JavaScript (NodeJS) 3
  4. 4. Языйи дкя репвепмнй пазпабнсйи Ннвая внкма? • Go • Erlang • Scala • Groovy • … 4
  5. 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
  6. 6. Ппнснйнк CGI #!/usr/bin/python print print print print "HTTP/1.0 301 Found" "Location: http://go.mail.ru/" "Set-Cookie: name=value" "" 6
  7. 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. 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
  9. 9. GET оапалеспы Гиоепррыкйа <a href=‘/hello.cgi?name=me&greeting=hello’>Hello!</a> Пепелеммая нйптжемия QUERY_STRING=name=me&greeting=hello CGI рйпиос import urlparse params = urlparse.parse_qs('name=me&greeting=hello') 9
  10. 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. 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. 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('<', '&lt;') story = story.replace('>', '&gt;') 12
  13. 13. Пепелеммые нйптжемия  HTTP_COOKIE  HTTP_USER_AGENT  PATH_INFO  QUERY_STRING  REMOTE_ADDR  REQUEST_METHOD  SCRIPT_FILENAME  SCRIPT_NAME  … 13
  14. 14. Акьсепмасивы CGI 1. Кнлоикипнвамие опнгпаллъ 2. Дптгнй опнснйнк (FastCGI, SCGI, PCGI, WSGI) 3. Сепвкесъ в Java 14
  15. 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
  16. 16. Werkzeug Днйтлемсахия http://werkzeug.pocoo.org/ Ппилеп опикнжемия https://github.com/mitsuhiko/werkzeug/blob/master/examples/ shortly/shortly.py 16
  17. 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. 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. 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
  20. 20. Акьсепмасивы 1. UWSGI (C) 2. Tornado (Python) 3. Gunicorn (Python) 20
  21. 21. Речаелые задаци 21
  22. 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. 23. Обпабнсйа унпл 1. Одим нбпабнсций дкю нснбпажемию и излемемию нбщейса 2. Сннбшемие нб нчибйе и троефе 3. Ппнвепйа даммъф ма репвепе и йкиемсе 4. Редипейс онрке въонкмемию дейрсвию 23
  24. 24. Пепемаопавкемия Ссастры нсвеса 301 Moved Permanently 302 Found Йтда? Location: http://go.mail.ru/ 24
  25. 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. 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. 27. Хпамемие даммыф ма йкиемсе Чсн мтжмн фпамись н онкьзнвасеке?  Пнкызнвасекырйие марспнййи  Впелеммтэ имунплахиэ  Авснпизнвам ки онкызнвасекы Cookie и реррии  Cookie оепедаэсрю влерсе заопнрнл  Серрии фпамюсрю ма репвепе (в уайкаф, в базе), идемсиуийаснп реррии оепедаэсрю в йтйаф 27
  28. 28. Cookie и реррии Cеррии  бнкее топавкюелъе (лнжмн рбпнрисы)  рмилаэс нгпамицемие ма пазлеп  спебтэс онддепжйи бьйемда  лнгтс възъвасы опнбкелъ опи върнйиф магптзйаф Cookie  Огпамицемию ма пазлеп и йнкицерсвн  опайсицерйи ме топавкюелъе  оепедаэсрю он реси р йаждъл заопнрнл 28
  29. 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
  30. 30. Шабкнмизаснпы ''' <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) 30
  31. 31. Шабкнмизаснпы 31
  32. 32. Шабкнмизаснпы Jinja2 ~ Django {% extends "layout.html" %} {% block body %} <ul> {% for user in users %} <li> {% include helper %}</li> {% endfor %} </ul> {% endblock %} 32
  33. 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
  34. 34. Фпейлвнпйи 34
  35. 35.  Гнснваю апфисейстпа опнейса  Эйнмнлию пертпрнв  Уцарсие в Open Source опнейсаф  Вре иф иронкызтэс 35
  36. 36. Flask Днйтлемсахия http://flask.pocoo.org/ Ппилепы опикнжемий https://github.com/mitsuhiko/flask/tree/master/examples 36
  37. 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. 38. MVC Model-view-controller – рфела иронкызнвамию мерйнкыйиф чабкнмнв опнейсипнвамию, р онлншыэ йнснпъф лндекы даммъф опикнжемию, онкызнвасекырйий имсепуейр и взаилндейрсвие р онкызнвасекел паздекемъ ма спи нсдекымъф йнлонмемса сай, цсн лндиуийахию ндмнгн из йнлонмемснв нйазъваес лимилакымне внздейрсвие ма нрсакымъе. 38
  39. 39. 39
  40. 40. • PHP (CodeIgniter, Yii) • ASP (ASP.NET MVC Framework) • Perl (Catalyst) • Python (Django, Pyramid) • Ruby (Ruby on Rails) 40
  41. 41. 41
  42. 42. 42
  43. 43. Instagram  40+ ликкинмнв онкызнвасекей  100+ випстакымъф репвепнв в EC2  Ппнейс йтокем Facebook за 1 лкпд. днкк  1 ликкинм пегирспахий за 12 царнв онрке заотрйа Androidвеприи  5 пазпабнсцийнв 43
  44. 44. Pinterest  3 ликкинма тмийакымъф онресисекей в демы  18 ликкинмнв тмийакымъф онресисекей в лерюх  4-ю он оноткюпмнрси рнхиакымаю ресы в США онрке Facebook, Twitter и LinkedIn  410Тб онкызнвасекырйиф даммъф 44
  45. 45. Disqus  500 ликкинмнв тмийакымъф онресисекей в лерюх  750 сърюц райснв иронкызтэс Disqus  1,5 ликкинма ндмнвпелеммъф онкызнвасекей  165 сърюц рннбшемий в рейтмдт  8 имжемепнв-пазпабнсцийнв 45
  46. 46. Дптгие опилепы ма http://www.djangosites.org/ 46
  47. 47. 47
  48. 48. Внзлнжмнрси  Гибйаю ORM  Легйн марспаиваелъй имсепуейр адлимирспаснпа  Дироесцеп тпкнв ма нрмнве пегткюпмъф въпажемий  Наркеднвамие чабкнмнв  Кечиптэший упейлвнпй  Имсепмахинмакизахию  Шабкнмъ утмйхий йнмспнккепа  Community 48
  49. 49. Ппикнжемия  Ппнейс рнрснис из мерйнкыйиф опикнжемий  Мнгтс кежасы в кэбнл лерсе PythonPath  Мнгтс иронкызнвасырю пазмъли опнейсали  Ппикнжемие – паздек райса кибн рйвнзмнй утмйхинмак 49
  50. 50. Development python manage.py runserver Дптгие онкезмые внзлнжмнрси python manage.py help Deploy WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py WSGIPythonPath /path/to/mysite.com 50
  51. 51.  https://docs.djangoproject.com/  http://django.me/render  https://github.com/django/django  http://www.djangosites.org/with-source/  http://stackoverflow.com/ 51
  52. 52. Соарибн за вмиламие Акейрамдп Бейбткаснв, a.bekbulatov@corp. mail.ru

×