17. Паяжина

17. Паяжина

17. Паяжина

11 май 2016

Имате домашно

предадените решения са цифром и словом 0(НУЛА)

Паяжина

Ще ви говорим за третото 'w' от 'www'

Как тъй краткия текст "facebook.com" ви навежда на мисли със син фон, пълни със снимките от нереално красивите и интересни ваканции на приятелите ви.

С какво "facebook.com" е различно от "чорба с праз"? И двете са текст от 13 символа

HTTP

Client-Server протокол, за раздаване на документи

Измислен е с цел споделяне на научни документи

Това значи предимно текст, леко форматиран и (недай си Боже!) някоя картинка

HTTP/1.1

От това нещо някак се раждат неща като twitter, facebook, amazon

HTTP/2.0

RFC по темата

Според w3tech около 7.5% от сайтовете вече го поддържат към април тази година

the basics

Когато искаме да направим връзка с друга машина през мрежата

операционната система знае през кое мрежово устройство да изпрати пакет, който е предназначен за някой IP адрес

най-често това означава, че пакета стига до вашия gateway(примерно рутера ви вкъщи), който знае на къде да го изпрати, за да стигне до крайната си цел

от вашата мапина до целта обикновено се минава през много на брой други машини(hop-ове)

ако връзката е TCP(няма да мислим за други за сега) имаме гаранция, че всички изпратени пакети са доставени, тъй като получаваме потвърждения и при неуспех изпращаме отново

от гледна точка на вашия код всички тези неща изглеждат доста просто

HTTПротокола

Текстов

Без състяние

Клиента праща "заявка", сървъра отговаря с "отговор"

От какво се състоят

И двете се сътоят от headers и body

"Мета" данни и данни

Headers

Ключ: Стойност

Описани са в стандарта

Body

Каквато и да е купчина от байтове

Заявка пример

www.example.comtext/plain

Отговор

Mon, 23 May 2005 22:38:34 GMTApache/1.3.3.7 (Unix) (Red-Hat/Linux)Wed, 08 Jan 2003 23:11:55 GMT"3f80f-1b6-3e1cb03b"text/plain; charset=UTF-812bytescloseWolrd!

socketserver

Просто TCP сървър

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

http.server

Строи върху socketserver с HTTP протокола

from http.server import BaseHTTPRequestHandler, HTTPServer

# HTTPRequestHandler class
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):

  # GET
  def do_GET(self):
        # Send response status code
        self.send_response(200)

        # Send headers
        self.send_header('Content-type','text/html')
        self.end_headers()

        # Send message back to client
        message = "Hello world!"
        # Write content as utf-8 data
        self.wfile.write(bytes(message, "utf8"))
        return

def run():
  print('starting server...')

  # Server settings
  # Choose port 8080, for port 80, which is normally used for a http server, you need root access
  server_address = ('127.0.0.1', 8081)
  httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  print('running server...')
  httpd.serve_forever()


run()

http.client

Клиетска библиотека за HTTP

Най - често ще е по - добре да използвате urllib.request

Имена

Спомняте ли си facebook.com? Какво е това .com в крайна сметка?

Компютрите не разбират от имена на човешки език, комуникират чрез Internet Protocol

Всеки (почти) компютър в паяжината има уникален (почти) IP address, който се използва за комуникация

DNS

Трябва да се случи превеждане от facebook.com до IP адрес, например 173.252.120.6

Domain Name System върши това

Това е глобална, централизирана и същевременно разпределена (what!?) и изключително добре обмислена система

Централизира и разпределена?

DNS in python

socket.gethostbyname и socket.gethostbyname_ex

Frameworks

много на брой

задачата им

flask

пример

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello flask!"


if name == "__main__":
    app.run()

после

pip install Flask
python hello.py

muffin

import muffin

app = muffin.Application('example')
@app.register('/', '/hello/{name}')

def hello(request):
    name = request.match_info.get('name', 'anonymous')
    return 'Hello %s!' % name

после pip install muffin python3 hello.py run

Въпроси?