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

Python Study 7 - Web Programming

Python Study 7 - Webย Programming

Avatar for AhnSeongHyun

AhnSeongHyun

May 19, 2015
Tweet

More Decks by AhnSeongHyun

Other Decks in Programming

Transcript

  1. urllib2 ํŒจํ‚ค์ง€ 3 http, ftp ์„œ๋ฒ„์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ํด๋ผ์ด์–ธํŠธ ์ž‘์„ฑ์‹œ

    ์‚ฌ์šฉ. ์›น ํŽ˜์ด์ง€, ์ž๋™ํ™” ๋„๊ตฌ, ํ”„๋ก์‹œ, ์›นํฌ๋กค๋Ÿฌ ๋“ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธ์–ด์˜ค๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ. ๏ƒผ urllib vs. urllib2 - URL ๋งŒ vs. URL, Request urlib2.urlopen(url [, data [, timeout]]) - ์š”์ฒญ ๋ณด๋‚ด๊ธฐ - url : ๋ฌธ์ž์—ด url, Request ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค - data : POST ๋ฐฉ์‹ ์ „์†ก์‹œ ํผ๋ฐ์ดํ„ฐ, URL ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ - timeout : ์ดˆ - ํŒŒ์ผ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•œ ๊ฐ์ฒด ๋ฐ˜ํ™˜
  2. urllib2.urlopen 4 ๋ฉ”์†Œ๋“œ ์„ค๋ช… read(size) Size ๋งŒํผ์˜ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜, ์ง€์ •ํ•˜์ง€

    ์•Š์œผ๋ฉด ์ „์ฒด readline() ํ•œ์ค„์˜ ํ…์ŠคํŠธ ๋ฐ˜ํ™˜ readlines() ๋ชจ๋“ ์ค„์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ close() ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ info() URL ๊ณผ ๊ด€๋ จ๋œ ๋ฉ”ํƒ€์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ˜ํ™˜ getcode() HTTP ์‘๋‹ต์ฝ”๋“œ ์ •์ˆ˜ ๋ฐ˜ํ™˜ geturl() ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ์˜ ์‹ค์ œ URL ๋ฐ˜ํ™˜, redirection ๊ณ ๋ ค urlopen() ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ์ฒด์˜ ํ•จ์ˆ˜๋“ค
  3. urllib2.urlopen 5 <! DOCTYPE html> 1070 Cache-Control: private Content-Length: 65092

    Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/6.0 X-AspNet-Version: 4.0.30319 X-Internal-Url: / Set-Cookie: TriggerOverlay=membership- 02|7|http://images.wolfgangsvault.com/cvfeatures/cream_clapto n_400x533.jpg; expires=Thu, 19-Jun-2014 06:04:35 GMT; path=/ Date: Thu, 19 Jun 2014 05:04:35 GMT Connection: close 200 http://www.concertvault.com/
  4. urllib2.Request 6 ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์€ url ๋ฌธ์ž์—ด๋กœ ํ˜ธ์ถœ ์ƒ์„ธํ•œ ์ง€์ •์„ Request

    ํด๋ž˜์Šค ์ด์šฉ > { "foo": [ "bar" ], "q": [ "query string" ] } data ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด post ๋ฐฉ์‹์œผ๋กœ ์ž๋™ ๋ณ€๊ฒฝ urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable]) ๏ƒผ data ์ถ”๊ฐ€
  5. urllib2.Request 7 { "Accept-Encoding": "identity", "Api-Link": "http://dev.danal.co.kr", "Api-Version": "1.0", "Connection":

    "close", "Content-Length": "", "Content-Type": "", "Host": "localhost:5000", "User-Agent": "Python-urllib/2.7" } ๏ƒผ header ์ถ”๊ฐ€
  6. urllib2.Request 8 Request.add_data(data) - ์š”์ฒญ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ - POST ๋ฐฉ์‹์œผ๋กœ

    ๋ณ€๊ฒฝ, data ๋Š” URL ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ Request.get_method() - http method ๋ฐ˜ํ™˜ Request.has_data() - ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ Request.get_data() - ์š”์ฒญ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ Request.add_header(key, val) - ํ—ค๋”์ •๋ณด ์ถ”๊ฐ€ , key ๊ฐ€ ํ—ค๋”์ด๋ฆ„, val ๊ฐ€ ํ—ค๋”๊ฐ’ Request.add_unredirected_header(key, header) - redirect ๊ฐ€ ์žˆ์„๊ฒฝ์šฐ์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์„ ํ—ค๋”์ •๋ณด ์ถ”๊ฐ€ Request.has_header(header) - ํ—ค๋”์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€
  7. urllib2.Request 9 Request.get_full_url() - ์ „์ฒด url ๋ฐ˜ํ™˜ Request.get_type() - url์˜

    ํƒ€์ž…๋ฐ˜ํ™˜ Request.get_host() - ์š”์ฒญ์„ ๋ณด๋‚ผ host ๋ฐ˜ํ™˜ Request.get_selector() - URL ์—์„œ selector ๋ถ€๋ถ„ ๋ฐ˜ํ™˜ Request.get_header(header_name, default=None) - ์ง€์ •ํ•œ ํ—ค๋”์— ๋Œ€ํ•œ ๊ฐ’ ๋ฐ˜ํ™˜ Request.header_items() - ํ—ค๋”์ •๋ณด ์ „์ฒด ๋ฐ˜ํ™˜ Request.is_unverifiable() - ์š”์ฒญ์„ ๊ฒ€์ฆํ• ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ True ๋ฐ˜ํ™˜
  8. urllib2.build_opener 10 urlopen() ํ•จ์ˆ˜๋Š” ์ธ์ฆ, ์ฟ ํ‚ค ๋“ฑ์˜ HTTP ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ง€์›ํ•˜์ง€

    ์•Š์Œ. ์ปค์Šคํ…€ ์˜คํ”„๋„ˆ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ. ํ•„์š”ํ•œ handler ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ ๏ƒผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ handler.. urllib2.build_opener([handler, ...]) ํด๋ž˜์Šค ์„ค๋ช… urllib2.HTTPBasicAuthHandler ๊ธฐ๋ณธ http ์ธ์ฆ ์ฒ˜๋ฆฌ urllib2.HTTPDigestAuthHandler HTTP digest ์ธ์ฆ ์ฒ˜๋ฆฌ urllib2.HTTPCookieProcessor HTTP ์ฟ ํ‚ค์ฒ˜๋ฆฌ urllib2.HTTPHandler url์„ HTTP ๋กœ ์—ด๊ธฐ urllib2.HTTPSHandler url์„ HTTPS ๋กœ ์—ด๊ธฐ urllib2.HTTPRedirectHandler HTTP ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์ฒ˜๋ฆฌ
  9. urllib2.build_opener 11 ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด์žˆ๋Š” handler ๋“ค. ['__doc__', '__init__', '__module__', '_call_chain',

    '_open', 'add_handler', 'addheaders', 'close', 'error', 'handle_error', 'handle_open', 'handlers', 'open', 'process_request', 'process_response']
  10. urlparse 14 URL ๋ฌธ์ž์—ด ์กฐ์ž‘ํ• ๋•Œ ์‚ฌ์šฉ http 10.10.1.126:8090 /pages/viewpage.action pageId=3179193

    None None 10.10.1.126 8090 netloc : ๋„คํŠธ์›Œํฌ ์œ„์น˜ ์ง€์ •์ž fragment : ์•ž์ชฝ#์„ ๋บ€ ์ง€์ •์ž
  11. urljoin, urlsplit 15 Base URL + ์ง€์ •ํ•œ URL = ์ ˆ๋Œ€

    URL > http://10.10.1.126:8090/page > http://10.10.1.126:8090/1 params ์ œ์™ธ, urlparse ์™€ ๋™์ผ > SplitResult(scheme='http', netloc='10.10.1.126:8090', path='/pages/viewpage.action', query='pageId=3179193', fragment='')
  12. urlencode 16 urlencode(query) - query : ์‚ฌ์ „์ด๊ฑฐ๋‚˜ ์Œ๋“ค์˜ ์ˆœ์„œ quote

    ๏ƒณ unquote quote_plus ๏ƒณ unquote_plus ash84_jin%3D%20%40gmail.com ash84_jin%3D+%40gmail.com ash84_jin= @gmail.com ash84_jin= @gmail.com
  13. error 17 exception urllib2.URLError - IOError ์˜ ์„œ๋ธŒ ํด๋ž˜์Šค -

    reason ์†์„ฑ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. exception urllib2.HTTPError - URLError์˜ ์„œ๋ธŒ ํด๋ž˜์Šค - HTTP ํ”„๋กœํ† ์ฝœ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ - ์ธ์ฆ์š”๊ตฌ์™€ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋ฆฌ๋Š”๋ฐ ์‚ฌ์šฉ. - HTTP Staus code, reason ์†์„ฑ exception urllib.ContentTooShortError - ๋‹ค์šด๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์˜ˆ์ƒํ•œ๊ฒƒ(Content-length) ์ ์€ ๊ฒฝ์šฐ ๋ฐœ์ƒ
  14. ftplib 18 FTP ํ”„๋กœํ† ์ฝœ๋กœ ํด๋ผ์ด์–ธํŠธ์ชฝ ๊ตฌํ˜„์‹œ ์‚ฌ์šฉ class ftplib.FTP([host[, user[,

    passwd[, acct[, timeout]]]]]) - FTP ์—ฐ๊ฒฐ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ - host ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์ž๋™์œผ๋กœ connect() ํ•จ์ˆ˜ ํ˜ธ์ถœ. - user, password, acct ๋ฅผ ์ง€์ •ํ•˜๋ฉด login() ํ•จ์ˆ˜ ํ˜ธ์ถœ. FTP.connect(host[, port[, timeout]]) FTP.login([user[, passwd[, acct]]]) FTP.close()
  15. ftplib 19 ftp.cwd(path) - ๋””๋ ‰ํ† ๋ฆฌ ๋ณ€๊ฒฝ, cd.. ftp.mkd() - ์„œ๋ฒ„์—

    ์ƒˆ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ftp.rename(old, new) - ์„œ๋ฒ„์˜ ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ ftp.pwd() - ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ˜ํ™˜ ftp.rmd(dirname) - ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ ftp.dir(dirname) - โ€˜LISTโ€™ ๋ช…๋ น ํ˜ธ์ถœ, ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ์ค€ ์ถœ๋ ฅ - dirname ์ง€์ •ํ•˜๋ฉด ์ง€์ •ํ•œ๊ณณ์œผ๋กœ ์ถœ๋ ฅ ftp.size(filename) - ์ง€์ •ํ•œ ํŒŒ์ผ์˜ ์‚ฌ์ด์ฆˆ ์ถœ๋ ฅ
  16. ftplib 20 ftp.storbinary(command, file, [, blocksize]) - ์ด์ง„ ์ „์†ก๋ชจ๋“œ๋กœ ๋ฐ์ดํ„ฐ

    ์ „์†ก - command ๋Š” ๋ฌธ์ž์—ด, โ€œSTOR โ€œ+filename - blocksize ๋Š” ์ „์†ก์— ์‚ฌ์šฉํ•  ๋ธ”๋กํฌ๊ธฐ ftp.storlines(command, file) - ํ…์ŠคํŠธ ์ „์†ก ๋ชจ๋“œ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก - command ๋Š” ๋ฌธ์ž์—ด, โ€œSTOR โ€œ+filename
  17. ftplib 21 ftp.retrlines(command [, callback]) - ์„œ๋ฒ„์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ

    ํ…์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ - callback ์€ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ง€์ •, ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด stdout ftp.retrbianry(command, callback [, blocksizes [, rest]]) - ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ด์ง„ ์ „์†ก ๋ชจ๋“œ๋กœ ๋ฐ˜ํ™˜ - command : โ€œRETR โ€+filename - callback : ๋ฐ์ดํ„ฐ ๋ธ”๋ก ๋ฐ›์„๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ - rest : ํŒŒ์ผ ์˜คํ”„์…‹
  18. base64 22 base64, base16, base32 ์ธ์ฝ”๋”ฉ์„ใ„น ์‚ฌ์šฉํ•˜์—ฌ ์ด์ง„๋ฐ์ดํ„ฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ์ธ์ฝ”๋”ฉ

    ํ˜น์€ ๋””์ฝ”๋”ฉ ๋ฉ”์ผ์ฒจ๋ถ€๋‚˜ http ํ”„๋กœํ† ์ฝœ์—์„œ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ altchars : base64 ์ถœ๋ ฅ์—์„œ +, \ ์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ 2๊ฐœ์˜ ๋ฌธ์ž์—ด ์ง€์ • YXNoODQ6MTIzNA== ash84:1234 YXNoODQ6MTIzNA== ash84:1234 61736838343A31323334 ash84:1234 MFZWQOBUHIYTEMZU ash84:1234
  19. xml.dom.minidom 24 XML ์„ ํŒŒ์‹ฑํ•ด์„œ DOM ๊ทœ์•ฝ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ์— ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ

    ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต parse, parseString() ์œผ๋กœ ํŒŒ์‹ฑ attributes firstchild lastchild nodename nodetype getElementByTagName() hasAttributes() getAttribute() documentElement() appendChild() removeChild() replaceChild()
  20. xml.sax 25 SAX2 API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑ start parsing

    attr : domain t1 attr : price 12000 attr : domain gs attr : domain ld attr : domain sas attr : domain 342d end parsing xml.sax.ContentHandler ์˜ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ ์ผ์ข…์˜ handler ํŠน์ • ๊ฒฝ์šฐ์— ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น - startDocuemnt : ๋ฌธ์„œ ์‹œ์ž‘์‹œ ํ˜ธ์ถœ - endDocuemnt : ๋ฌธ์„œ ์‹œ์ž‘์‹œ ํ˜ธ์ถœ - startElement : ์—˜๋ฆฌ๋จผํŠธ ์‹œ์ž‘์‹œ - endElement: ์—˜๋ฆฌ๋จผํŠธ ๋๋‚ ๊ฒฝ์šฐ
  21. json 27 dump, load ํ•จ์ˆ˜๋Š” ํŒŒ์ผ๊ฐ์ฒด ๋Œ€์ƒ dumps, loads ํ•จ์ˆ˜๋Š”

    ๋ฌธ์ž์—ด ๋Œ€์ƒ {"habits": ["cooking", "camping", "sleeping"], "name": "ash84"} <type 'dict'> {u'habits': [u'cooking', u'camping', u'sleeping'], u'name': u'ash84'}
  22. json 28 object_hook : ๋””์ฝ”๋”ฉ๋œ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ, ์ค‘๊ฐ„์—

    ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ํ•  ํ•จ์ˆ˜ ์ง€์ •. cls : ๋””์ฝ”๋”ฉํ•  JSONDecoder ํ•˜์œ„ ํด๋ž˜์Šค ์ง€์ • parse_float, parse_int : ๋ถ€๋™์†Œ์ˆ˜์ , ์ •์ˆ˜๊ฐ’ ๋””์ฝ”๋”ฉ์„ ์œ„ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ง€์ •. {u'name': u'ash8\n4', 'habit': u'cooking'}
  23. hashlib 29 ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ํ•ด์‹œ์™€ MD5, SHA ๋“ฑ์˜ Message-digest ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ๊ตฌํ˜„ ๋ชจ๋“ˆ ํ•จ์ˆ˜ ์„ค๋ช… md5(data) MD5 ํ•ด์‹œ(128๋น„ํŠธ) sha1(data) SHA1 ํ•ด์‹œ(160๋น„ํŠธ) sha224(data) SHA224 ํ•ด์‹œ(226๋น„ํŠธ) shar256(data) SHA256 ํ•ด์‹œ(256๋น„ํŠธ) sha384(data) SHA384 ํ•ด์‹œ(384๋น„ํŠธ) sha512(data) SHA512 ํ•ด์‹œ(512๋น„ํŠธ) ํ•จ์ˆ˜ ์„ค๋ช… d.update(data) ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์—…๋ฐ์ดํŠธ, ๊ทธ๋Ÿฌ๋‚˜ ์ด์–ด์ง€๋Š” ๊ฒƒ. ๋ฎ์–ด์จ์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค. d.digest() ๋ฌด๊ฐ€๊ณต ๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด๋กœ ์š”์•ฝ ๊ฐ’ ๋ฐ˜ํ™˜ d.hexdigest() 16์ง„์ˆ˜ ์ˆซ์ž๋“ค๋กœ ์ธ์ฝ”๋”ฉ๋œ ์š”์•ฝํ…์ŠคํŠธ ์œ„์˜ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋“ค.
  24. ์ •๋ฆฌ 31 urllib, urllib2 ๋ฅผ ์ด์šฉ, ์ƒ์„ธํ•œ ์š”์ฒญ์€ Request ์ธ์ฆ,

    ์ฟ ํ‚ค ๋“ฑ์˜ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ => build_opener ์ด์šฉ, ์ปค์Šคํ…€ ์˜คํ”„๋„ˆ urlencode ๋Š” ํ˜ธ์ถœ์‹œ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ. error ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜์ž. 401, 404, 500 XML ํŒŒ์‹ฑ => ์šฉ๋„์™€ ํฌ๊ธฐ ๊ณ ๋ ค JSON, dump, load ๋งŒ ๊ธฐ์–ต hashlib ์—์„œ update ๋Š” ๊ฐฑ์‹ ์ด ์•„๋‹ˆ๋ผ concat