Werkzeug: ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์˜ˆ์™ธ๋ฅผ ์ผ์œผํ‚ค๋Š” ImportError

์— ๋งŒ๋“  2016๋…„ 12์›” 22์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pallets/werkzeug

์•ฝ๊ฐ„์˜ ๋””๋ฒ„๊น… ํ›„ ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ werkzeug/http.py#L26 ์œผ๋กœ ์ขํ˜€ ImportError: cannot import name 'parse_http_list' ์˜ˆ์™ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ด์ „ ํŒŒ์ด์ฌ ์ฐธ์กฐ๋กœ ํด๋ฐฑ์„ ์‹œ๋„ํ•˜๋Š” ์˜ˆ์™ธ ๋‚ด๋ถ€์˜ ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•˜๋Š” ์ „์ฒด ์—ญ์ถ”์ ์ž…๋‹ˆ๋‹ค.

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/werkzeug/http.py", line 26, in <module>
    from urllib2 import parse_http_list as _parse_list_header
ImportError: No module named 'urllib2'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "examples/http.py", line 2, in <module>
    from flask import Flask
  File "/usr/local/lib/python3.5/site-packages/flask/__init__.py", line 17, in <module>
    from werkzeug.exceptions import abort
  File "/usr/local/lib/python3.5/site-packages/werkzeug/__init__.py", line 152, in <module>
    __import__('werkzeug.exceptions')
  File "/usr/local/lib/python3.5/site-packages/werkzeug/exceptions.py", line 71, in <module>
    from werkzeug.wrappers import Response
  File "/usr/local/lib/python3.5/site-packages/werkzeug/wrappers.py", line 26, in <module>
    from werkzeug.http import HTTP_STATUS_CODES, \
  File "/usr/local/lib/python3.5/site-packages/werkzeug/http.py", line 28, in <module>
    from urllib.request import parse_http_list as _parse_list_header
  File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 88, in <module>
    import http.client
  File "/Users/alexgurrola/Projects/intrepid/examples/http.py", line 2, in <module>
    from flask import Flask
ImportError: cannot import name 'Flask'

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํŒŒ์ผ ์ด๋ฆ„์„ http.py์—์„œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด stdlib์˜ http ๋ชจ๋“ˆ๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  5 ๋Œ“๊ธ€

์ด๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

Python 3.5.2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด werkzeug/http.py ์ด ๋‹จ๋ฝ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

try:
    from urllib.request import parse_http_list as _parse_list_header
    from urllib.parse import unquote_to_bytes as _unquote
except ImportError:  # pragma: no cover
    from urllib2 import parse_http_list as _parse_list_header, \
        unquote as _unquote

๋˜ํ•œ ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” try/except ์—†๋Š” ๋” ๊นŠ์€ ์ˆ˜์ค€์—์„œ ๋ถˆํ‰ํ•  ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” urllib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ API์˜ ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ์„ ๊ฒฝ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด๋œ๋‹ค๋ฉด ์›๋ž˜ Flask 0.12๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

import os
from flask import Flask

app = Flask(__name__)
app.config.from_object(os.environ['APP_SETTINGS'])


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


if __name__ == '__main__':
    app.run()

ํŒŒ์ผ ์ด๋ฆ„์„ http.py์—์„œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด stdlib์˜ http ๋ชจ๋“ˆ๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ Python์€ ๊ฐ™์€ ์ด๋ฆ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฑฐ์œ„ ์ถ”๊ฒฉ์ „์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค... ๋„์›€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„์„ http.py์—์„œ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด stdlib์˜ http ๋ชจ๋“ˆ๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒŒ์ด์ฌ์„ ์ฒ˜์Œ ์ ‘ํ•ด์„œ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €๋‹ค....

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

Nessphoro picture Nessphoro  ยท  6์ฝ”๋ฉ˜ํŠธ

caiz picture caiz  ยท  3์ฝ”๋ฉ˜ํŠธ

SimonSapin picture SimonSapin  ยท  12์ฝ”๋ฉ˜ํŠธ

miki725 picture miki725  ยท  10์ฝ”๋ฉ˜ํŠธ

asottile picture asottile  ยท  11์ฝ”๋ฉ˜ํŠธ