Upgrade to PRO for Only $50/Yearโ€”Limited-Time Offer! ๐Ÿ”ฅ

Python Study 8 - Web Programming

Python Study 8 - Webย Programming

Avatar for AhnSeongHyun

AhnSeongHyun

May 18, 2015
Tweet

More Decks by AhnSeongHyun

Other Decks in Programming

Transcript

  1. http ํŒจํ‚ค์ง€ 3 HTTP ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ๊ณผ ์ƒํƒœ๊ด€๋ฆฌ(์ฟ ํ‚ค)๋ฅผ

    ์ง€์›ํ•˜๋Š” ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ. - httplib(http.client) : ์ €์ˆ˜์ค€์˜ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“ˆ => urllib - http.server ๋ชจ๋“ˆ : HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค ์ œ๊ณต - http.server => BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer
  2. http ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ 2๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ ๋ณดํ†ต ์ง์ ‘์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,

    ์›น์„œ๋ฒ„์˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š”๋ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ - SocketServer.TCPServer ์˜ ์„œ๋ธŒ ํด๋ž˜์Šค - SocketServer.BaseServer ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. - HTTP ์†Œ์ผ“์„ ์—ด๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ณ , ์š”์ฒญ์„ ์˜ค๋ฉด handler ๋กœ dispatch - ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์˜จ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹น. - ์ด ํด๋ž˜์Šค ์ž์ฒด์—์„œ ์ฒ˜๋ฆฌ X, ์„œ๋ธŒ ํด๋ž˜์Šค ์ž‘์„ฑํ•ด์„œ ๊ฐ๊ฐ์˜ HTTP method ๋ณ„๋กœ ์ฒ˜๋ฆฌ - ์„œ๋ธŒ ํด๋ž˜์‹ฑ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณต. - ์š”์ฒญ๊ณผ ํ—ค๋”๋ฅผ ํŒŒ์‹ฑ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ. BaseHTTPServer 4 HTTPServer(server_address, RequestHandlerClass) BaseHTTPReqeustHandler(request, client_address, server)
  3. BaseHTTPServer 5 ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ - ip, port ์ง€์ •ํ•ด์„œ ์„œ๋ฒ„ ๋„์šฐ๊ธฐ,

    ์„œ๋ฒ„์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•ธ๋“ค๋Ÿฌ ํด๋ž˜์Šค ์ง€์ • - serve_forever() : shutdown() ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  4. BaseHTTPServerHandler 7 ๏ƒผ ํด๋ž˜์Šค ๋ณ€์ˆ˜ server_version - ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๊ณ ํ• 

    ์„œ๋ฒ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ sys_version - ์‹œ์Šคํ…œ ๋ฒ„์ „ error_message_fotmat - ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ๋ณด๋‚ผ ํฌ๋งท protocol_version - HTTP ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ responses(message, explain) - HTTP ์—๋Ÿฌ ์ฝ”๋“œ์—๋Œ€ํ•œ ์„ค๋ช… ๋งตํ•‘ - 404 => (โ€œNot Foundโ€, โ€œNothing matches the given URI.โ€) <head> <title>Error response</title> </head> <body> <h1>Error response</h1> <p>Error code %(code)d. <p>Message: %(message)s. <p>Error code explanation: %(code)s = %(explain)s. </body>
  5. BaseHTTPServerHandler 8 ๏ƒผ ์ธ์Šคํ„ด์Šค ์†์„ฑ client_address : ํด๋ผ์ด์–ธํŠธ ์ฃผ์†Œ (host,

    port) command : HTTP method, GET, POST, PUT HEAD, DELETE path : ์š”์ฒญ๊ฒฝ๋กœ request_version : HTTP ๋ฒ„์ „ headers : HTTP Header rfile : ์ถ”๊ฐ€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•œ ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ, ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ๋ฅผ ํ–ˆ๋‹ค๋ฉด, rfile ์„ ํ†ตํ•ด์„œ ๋ฐ›์•„์˜ฌ์ˆ˜ ์žˆ๋‹ค. wfile : ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ
  6. BaseHTTPServerHandler 10 ๏ƒผ ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ send_error(code [, message]) - ์‹คํŒจํ•œ

    ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋ณด๋‚ด๊ธฐ, code ๋Š” HTTP ์ƒํƒœ์ฝ”๋“œ - error_meesage_format ์„ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ์‘๋‹ต์„ ๋ณด๋ƒ„. send_response(code [, message]) - ์„ฑ๊ณตํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋ณด๋‚ด๊ธฐ - ์‘๋‹ต์ค„์„ ๋ณด๋‚ด๊ณ  ๊ทธ ๋‹ค์Œ์œผ๋กœ Server, Date ํ—ค๋”๋ฅผ ์ „์†ก send_header(keyword, value) - ํ—ค๋” ์“ฐ๊ธฐ, send_response() ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ์— ํ˜ธ์ถœํ•ด์•ผ ํ•จ. end_headers() - ํ—ค๋”์˜ ๋์„ ์•Œ๋ฆฌ๋Š” ๋นˆ์ค„์„ ๋ณด๋‚ธ๋‹ค.
  7. SimpleHTTPServer. SimpleHttpRequestHandler 13 SimpleHTTPServer ๋ชจ๋“ˆ์€ SimpleHttpRequestHandler ๊ฐ€ ์ „๋ถ€. - ํ˜„์žฌ

    ๋””๋ ‰ํ† ๋ฆฌ์™€ ๊ทธ ํ•˜์œ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ ์ œ๊ณต - HEAD ์™€ GET ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณต - ๋ชจ๋“  IOError ์˜ˆ์™ธ๋Š” 404 File not found ์—๋Ÿฌ ๋ฐœ์ƒ - ์ผ์ข…์˜ ์ •์  ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค. - ์ปค์Šคํ…€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„œ๋ธŒ ํด๋ž˜์‹ฑํ•ด์„œ ์‚ฌ์šฉ. SimpleHTTPServer.SimpleHTTPRequestHandler(request, client_address, server)
  8. SimpleHTTPServer 14 simplehttpserver - sphttp.py - html - food -index.html

    - place -index.html ๏ƒผ ๋””๋ ‰ํ† ๋ฆฌ๋‚ด index.html ์ด ์žˆ์œผ๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ์‹œ index.html ๋ถˆ๋Ÿฌ์™€์„œ ๋ณด์—ฌ์ค€๋‹ค.
  9. CGIHTTPServer. CGIHTTPRequestHandler 15 - CGIHTTPServer ๋ชจ๋“ˆ์€ CGIHttpRequestHandler ๊ฐ€ ์ „๋ถ€. -

    ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์™€ ๊ทธ ํ•˜์œ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ํŒŒ์ผ ์ œ๊ณต - HEAD ์™€ GET, POST ๋ฉ”์„œ๋“œ๋งŒ ์ œ๊ณต - HTTP redirect(302) ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. - ๊ฐ„๋‹จํ•œ CGI ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ. ๊ธฐ๋ณธ GCI ๋””๋ ‰ํ† ๋ฆฌ : โ€˜/cgi-binโ€™, โ€˜htbinโ€™ ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ ๋ณ€๊ฒฝ : handler = CGIHTTPServer.CGIHTTPRequestHandler handler.cgi_directories = ["/"]
  10. WSGI(Web Server Gateway Interface) 17 ๏ƒผ WSGI ( Web Server

    Gateway Interface )๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ? - WSGI ๋Š” web server์™€ ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋œ web application ๋˜๋Š” framework๋“ค๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ์ •์˜ํ•ด ๋†“์€ ๊ทœ์น™. PEP333 ๏ƒผ ์™œ WSGI๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€? - ํŒŒ์ด์ฌ ์›น Application ๊ณผ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ์˜ ์„ ํƒ์˜ ์ œํ•œ ๋ฌธ์ œ - A ๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์•„ํŒŒ์น˜๋ฅผ ๋ชป์“ด๋‹ค? - ์•„ํŒŒ์น˜๋ฅผ ์—ฐ๋™ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, B Framework ๋ฅผ ๋ชป์“ด๋‹ค? - ๊ทธ๋Ÿฌ๋ฉด, ์„œ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ŠคํŽ™์„ ๋งŒ๋“ค์ž. => WSGI
  11. WSGI(Web Server Gateway Interface) 18 ์„œ๋ฒ„๋„ ์•„๋‹ˆ๊ณ , ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๋„ ์•„๋‹ˆ๊ณ ,

    API ๋„ ์•„๋‹ˆ๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์•„๋‹ˆ๋‹ค. Interface Spec - ์›น์„œ๋ฒ„ ์™€ ํŒŒ์ด์ฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ Interface Spec - ๊ทธ๋ž˜์„œ ์›น ์„œ๋ฒ„๋‹จ๊ณผ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์˜ ์ŠคํŽ™์ด ๊ฐ๊ฐ ์กด์žฌ - ์›น ์„œ๋ฒ„/ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, WSGI ๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•  ์ผ์€ ์—†๋‹ค. - ๊ทธ๋Ÿฌ๋‚˜ ์ดํ•ด๋Š” ํ•„์š”. Client Web Server based WSGI Web Application based WSGI request request response response tornado apache Flask Django
  12. WSGI Application Interface 19 WSGI Application Interface ๋Š” Callable Object

    ์—ฌ์•ผ ํ•จ. Callable Object(ํ˜ธ์ถœ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด) - ํ•จ์ˆ˜, ๋ฉค๋ฒ„ ๋ฉ”์†Œ๋“œ, ์ธ์Šคํ„ด์Šค.__call__() ์กฐ๊ฑด : 1. ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. - ์ฒซ๋ฒˆ์งธ, CGI ๋ณ€์ˆ˜์™€ ์œ ์‚ฌํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” dict ๊ฐ์ฒด - ๋‘๋ฒˆ์งธ, CallBack ํ•จ์ˆ˜ 2. list[Response Body(String)] ํ˜•์„ ๋ฐ˜๋“œ์‹œ ๋ฆฌํ„ด.
  13. WSGI Application Interface 20 environ - ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ

    ๋งˆ๋‹ค, ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด์ฃผ๋Š” ์ •๋ณด - http method, query ALLUSERSPROFILE: C:\ProgramData COMPUTERNAME: ยพรˆยผยบร‡รถ COMSPEC: C:\Windows\system32\cmd.exe CONTENT_LENGTH: CONTENT_TYPE: text/plain HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0. 8 HTTP_ACCEPT_ENCODING: gzip,deflate,sdch HTTP_ACCEPT_LANGUAGE: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 HTTP_CONNECTION: keep-alive HTTP_HOST: localhost:8051 HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 start_response(status, headers) - ์ฝœ๋ฐฑํ•จ์ˆ˜ - status : HTTP ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฌธ์ž์—ด - headers : ํŠœํ”Œ๋ฆฌ์ŠคํŠธ[(),()โ€ฆ] response_body - ์‹ค์ œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ - [๋ฌธ์ž์—ด] ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ ๏ƒผ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ
  14. WSGI Application Interface 21 ๏ƒผ __call__ ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๏ƒผ

    ๋ฉค๋ฒ„ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  15. WSGI Middleware 23 WSGI Application โ€“ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌ WSGI

    Middleware - WSGI Application ์ „ํ›„์˜ ์ฒ˜๋ฆฌ ํ˜น์€ environ ์˜ ํ™•์žฅ - PEP333 ์— ํŠน๋ณ„ํ•œ ๋ช…์„ธ๋Š” ์—†์Œ. ๊ฐ€์ด๋“œ๋งŒ.
  16. flask-tornado 27 tornado/wsgi.py/class WSGIContainer request โ€“ tornado ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ๋“ค์–ด์˜จ

    HTTP ์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” tornado.HTTPRequest ๊ฐ์ฒด WSGIContainer.envrion โ€“ ๋‚ด๋ถ€์˜ ๊ฐ’์„ WSGI environ ์— ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ๋งž์ถ”๋Š” ์ž‘์—…
  17. flask-tornado 28 Client Web Server based WSGI Web Application based

    WSGI localhost:8000 Tornado Flask WSGIContainer.__call__ Flask.__call__ start_response environ [response] HttpRequest.write(body) tornado.httprequest (environ, start_response) WebBrowser
  18. wsgiref 29 ๋งŒ๋“  WGSI ์›น App์„ ๋…๋ฆฝ์„œ๋ฒ„์—์„œ ํ…Œ์ŠคํŠธ ํ• ์ˆ˜ ์žˆ๊ฒŒํ•ด์ฃผ๋Š”WSGI

    ํ‘œ์ค€์˜ ์„œ๋ฒ„ํŒŒํŠธ ๏ƒผ wgsiref.simple_server ๋ชจ๋“ˆ - ๊ฐ„๋‹จํžˆ ํ•˜๋‚˜์˜ WSGI ๊ธฐ๋ฐ˜์˜ ๋…๋ฆฝ HTTP ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. make_server(host, port, app) ํ•จ์ˆ˜ - host:port ์˜ HTTP ์„œ๋ฒ„ ์ƒ์„ฑ - APP : WSGI Application Interface๋ฅผ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋‚˜ ํ˜ธ์ถœ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด - test_server.serve_forever() demo_app(environ, start_response) ํ•จ์ˆ˜ - โ€œHello worldโ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” WSGI Application Inteface ๊ตฌํ˜„์ฒด
  19. wsgiref 31 ๏ƒผ wgsiref.validator(app) - WSGI ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์‹ธ๋Š” ์ƒˆ๋กœ์šด WSGI

    ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ - ์ƒˆ๋กœ์šด ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ์‹ผ ๋Œ€์ƒ์ด WSGI ํ‘œ์ค€์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์‹คํ–‰. - ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด AssertionError ์˜ˆ์™ธ ๋ฐœ์ƒ
  20. ์ •๋ฆฌ 32 ์ •์  ์›น ์„œ๋ฒ„ => SimpleHTTPRequestServerHandler ๋ชจ๋“  HTTP methods

    ๊ตฌํ˜„ => BaseHTTPReqeustHandler ์˜ ์„œ๋ธŒํด๋ž˜์Šค ์ด์šฉ do_method(requset) { ๊ตฌํ˜„ } WSGI ๋Š” ์„œ๋ฒ„-์›น ์–ดํ”Œ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ŠคํŽ™ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ WSGI ๊ธฐ๋ฐ˜์ธ์ง€ ํ™•์ธ ์›น ์„œ๋ฒ„-WSGI ์ง€์› ๋ชจ๋“ˆ ํ™•์ธ Apache => mod-wsgi ngix => uwsgi