|
| 1 | += slide 'Имате домашно' do |
| 2 | + p предадените решения са цифром и словом 0(НУЛА) |
| 3 | + |
| 4 | += slide '' do |
| 5 | + img src="17/you-make-bunny-cry.jpg" |
| 6 | + |
| 7 | += slide 'Паяжина' do |
| 8 | + p Ще ви говорим за третото 'w' от 'www' |
| 9 | + p.action Как тъй краткия текст "facebook.com" ви навежда на мисли със син фон, пълни със снимките от нереално красивите и интересни ваканции на приятелите ви. |
| 10 | + p.action С какво "facebook.com" е различно от "чорба с праз"? И двете са текст от 13 символа |
| 11 | + |
| 12 | += slide 'HTTP' do |
| 13 | + p.action Client-Server протокол, за раздаване на документи |
| 14 | + p.action Измислен е с цел споделяне на научни документи |
| 15 | + p.action Това значи предимно текст, леко форматиран и (недай си Боже!) някоя картинка |
| 16 | + |
| 17 | += slide 'HTTP/1.1' do |
| 18 | + p.action От това нещо някак се раждат неща като twitter, facebook, amazon |
| 19 | + |
| 20 | += slide 'HTTP/2.0' do |
| 21 | + p <a href="https://tools.ietf.org/html/rfc7540">RFC</a> по темата |
| 22 | + p <a href="http://w3techs.com/technologies/details/ce-http2/all/all">Според w3tech</a> около 7.5% от сайтовете вече го поддържат към април тази година |
| 23 | + |
| 24 | += slide 'the basics' do |
| 25 | + p Когато искаме да направим връзка с друга машина през мрежата |
| 26 | + p.action операционната система знае през кое мрежово устройство да изпрати пакет, който е предназначен за някой IP адрес |
| 27 | + p.action най-често това означава, че пакета стига до вашия gateway(примерно рутера ви вкъщи), който знае на къде да го изпрати, за да стигне до крайната си цел |
| 28 | + p.action от вашата мапина до целта обикновено се минава през много на брой други машини(hop-ове) |
| 29 | + p.action ако връзката е TCP(няма да мислим за други за сега) имаме гаранция, че всички изпратени пакети са доставени, тъй като получаваме потвърждения и при неуспех изпращаме отново |
| 30 | + |
| 31 | + p.action от гледна точка на вашия код всички тези неща изглеждат доста просто |
| 32 | + |
| 33 | += slide 'HTTПротокола' do |
| 34 | + p.action Текстов |
| 35 | + p.action Без състяние |
| 36 | + p.action Клиента праща "заявка", сървъра отговаря с "отговор" |
| 37 | + |
| 38 | += slide 'От какво се състоят' do |
| 39 | + p.action И двете се сътоят от headers и body |
| 40 | + p.action "Мета" данни и данни |
| 41 | + |
| 42 | += slide 'Headers' do |
| 43 | + p.action Ключ: Стойност |
| 44 | + p.action Описани са в стандарта |
| 45 | + |
| 46 | += slide 'Body' do |
| 47 | + p.action Каквато и да е купчина от байтове |
| 48 | + |
| 49 | += slide 'Заявка пример' do |
| 50 | + |
| 51 | + example: |
| 52 | + |
| 53 | + GET /hello HTTP/1.1 |
| 54 | + Host: www.example.com |
| 55 | + Accept: text/plain |
| 56 | + |
| 57 | += slide 'Отговор' do |
| 58 | + |
| 59 | + example: |
| 60 | + |
| 61 | + HTTP/1.1 200 OK |
| 62 | + Date: Mon, 23 May 2005 22:38:34 GMT |
| 63 | + Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) |
| 64 | + Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT |
| 65 | + ETag: "3f80f-1b6-3e1cb03b" |
| 66 | + Content-Type: text/plain; charset=UTF-8 |
| 67 | + Content-Length: 12 |
| 68 | + Accept-Ranges: bytes |
| 69 | + Connection: close |
| 70 | + |
| 71 | + Hello Wolrd! |
| 72 | + |
| 73 | += slide 'socketserver' do |
| 74 | + p Просто TCP сървър |
| 75 | + example: |
| 76 | + import socketserver |
| 77 | + |
| 78 | + class MyTCPHandler(socketserver.BaseRequestHandler): |
| 79 | + """ |
| 80 | + The request handler class for our server. |
| 81 | + |
| 82 | + It is instantiated once per connection to the server, and must |
| 83 | + override the handle() method to implement communication to the |
| 84 | + client. |
| 85 | + """ |
| 86 | + |
| 87 | + def handle(self): |
| 88 | + # self.request is the TCP socket connected to the client |
| 89 | + self.data = self.request.recv(1024).strip() |
| 90 | + print("{} wrote:".format(self.client_address[0])) |
| 91 | + print(self.data) |
| 92 | + # just send back the same data, but upper-cased |
| 93 | + self.request.sendall(self.data.upper()) |
| 94 | + |
| 95 | + if __name__ == "__main__": |
| 96 | + HOST, PORT = "localhost", 9999 |
| 97 | + |
| 98 | + # Create the server, binding to localhost on port 9999 |
| 99 | + server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) |
| 100 | + |
| 101 | + # Activate the server; this will keep running until you |
| 102 | + # interrupt the program with Ctrl-C |
| 103 | + server.serve_forever() |
| 104 | + |
| 105 | + |
| 106 | += slide 'http.server' do |
| 107 | + p Строи върху socketserver с HTTP протокола |
| 108 | + |
| 109 | + example: |
| 110 | + from http.server import BaseHTTPRequestHandler, HTTPServer |
| 111 | + |
| 112 | + # HTTPRequestHandler class |
| 113 | + class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): |
| 114 | + |
| 115 | + # GET |
| 116 | + def do_GET(self): |
| 117 | + # Send response status code |
| 118 | + self.send_response(200) |
| 119 | + |
| 120 | + # Send headers |
| 121 | + self.send_header('Content-type','text/html') |
| 122 | + self.end_headers() |
| 123 | + |
| 124 | + # Send message back to client |
| 125 | + message = "Hello world!" |
| 126 | + # Write content as utf-8 data |
| 127 | + self.wfile.write(bytes(message, "utf8")) |
| 128 | + return |
| 129 | + |
| 130 | + def run(): |
| 131 | + print('starting server...') |
| 132 | + |
| 133 | + # Server settings |
| 134 | + # Choose port 8080, for port 80, which is normally used for a http server, you need root access |
| 135 | + server_address = ('127.0.0.1', 8081) |
| 136 | + httpd = HTTPServer(server_address, testHTTPServer_RequestHandler) |
| 137 | + print('running server...') |
| 138 | + httpd.serve_forever() |
| 139 | + |
| 140 | + |
| 141 | + run() |
| 142 | + |
| 143 | += slide 'http.client' do |
| 144 | + p Клиетска библиотека за HTTP |
| 145 | + p Най - често ще е по - добре да използвате urllib.request |
| 146 | + |
| 147 | + |
| 148 | += slide 'Имена' do |
| 149 | + p.action Спомняте ли си facebook.com? Какво е това .com в крайна сметка? |
| 150 | + p.action Компютрите не разбират от имена на човешки език, комуникират чрез Internet Protocol |
| 151 | + p.action Всеки (почти) компютър в паяжината има уникален (почти) IP address, който се използва за комуникация |
| 152 | + |
| 153 | += slide 'DNS' do |
| 154 | + p.action Трябва да се случи превеждане от facebook.com до IP адрес, например 173.252.120.6 |
| 155 | + p.action Domain Name System върши това |
| 156 | + p.action Това е глобална, централизирана и същевременно разпределена (what!?) и изключително добре обмислена система |
| 157 | + p.action Централизира и разпределена? |
| 158 | + |
| 159 | += slide 'DNS in python' do |
| 160 | + p socket.gethostbyname и socket.gethostbyname_ex |
| 161 | + |
| 162 | += slide 'Frameworks' do |
| 163 | + p много на брой |
| 164 | + ul |
| 165 | + li Django |
| 166 | + li Flask |
| 167 | + li Muffin |
| 168 | + li Pyramid |
| 169 | + li Tornado |
| 170 | + li Bottle |
| 171 | + li ... |
| 172 | + |
| 173 | += slide 'задачата им' do |
| 174 | + ul |
| 175 | + li url routing |
| 176 | + li сервриране на HTML / XML / JSON / text / etc. |
| 177 | + li database манипулации |
| 178 | + li security features (csrf) |
| 179 | + li сесии |
| 180 | + |
| 181 | + |
| 182 | += slide 'flask' do |
| 183 | + p пример |
| 184 | + example: |
| 185 | + from flask import Flask |
| 186 | + |
| 187 | + app = Flask(__name__) |
| 188 | + |
| 189 | + |
| 190 | + @app.route("/") |
| 191 | + def hello(): |
| 192 | + return "Hello flask!" |
| 193 | + |
| 194 | + |
| 195 | + if name == "__main__": |
| 196 | + app.run() |
| 197 | + |
| 198 | + p после |
| 199 | + |
| 200 | + example: |
| 201 | + pip install Flask |
| 202 | + python hello.py |
| 203 | + |
| 204 | + |
| 205 | += slide 'muffin' do |
| 206 | + example: |
| 207 | + import muffin |
| 208 | + |
| 209 | + app = muffin.Application('example') |
| 210 | + @app.register('/', '/hello/{name}') |
| 211 | + |
| 212 | + def hello(request): |
| 213 | + name = request.match_info.get('name', 'anonymous') |
| 214 | + return 'Hello %s!' % name |
| 215 | + |
| 216 | + p после |
| 217 | + |
| 218 | + pip install muffin |
| 219 | + python3 hello.py run |
0 commit comments