Werkzeug: ๋ฒ„์ „ 1.0.0์€ ์ด์ „์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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

2์‹œ๊ฐ„ ์ „์— ํ‘ธ์‹œ๋œ 1.0.0 ๋ฆด๋ฆฌ์Šค๋Š” flask๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ํšจ๊ณผ์ธ์ง€ ํ”Œ๋ผ์Šคํฌ๊ฐ€ ๋ฒ„์ „์„ ๊ณ ์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋˜๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ์™„์ „ํžˆ ๋”์ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ Flask-WTF 0.14.3์ด ๋ช‡ ์‹œ๊ฐ„ ์ „์— ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ด์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ง€์›์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ถœ์‹œํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ํŒ”๋ ˆํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ 6๊ฐœ์›” ๋ฏธ๋งŒ์— ์‹คํ–‰ํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์„ธ ๋ฒˆ์งธ๋กœ ๊นจ๋œจ๋ ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ „์ฒด ์—ญ์ถ”์ ์„ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ๋Š” Flask์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ Werkzeug๋Š” ์ด๋Ÿฌํ•œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ณ„์† ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 0.16์€ 5๊ฐœ์›” ๋™์•ˆ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ„์ „์„ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ด์Šˆ๋ฅผ ์—ด๊ฑฐ๋‚˜ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ์—์„œ PR์„ ์ œ์ถœํ•˜์—ฌ ํ™•์žฅ ๋ฐ ๊ธฐํƒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”Œ๋ผ์Šคํฌ ๊ด€๋ฆฌ์ž 1.5.5
  • ํ”Œ๋ผ์Šคํฌ-๋ฐ”๋ฒจ 1.0
  • Flask-BabelEx 0.9.4
  • flask-restplus (๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์Œ, flask-restx๋ฅผ ์œ„ํ•ด ์œ ์ง€๋˜์ง€ ์•Š์Œ)
  • flask-restx(๋ณ‘ํ•ฉ๋จ, ์•„์ง ๋ฆด๋ฆฌ์Šค๋˜์ง€ ์•Š์Œ)
  • ํ”Œ๋ผ์Šคํฌ ํ…Œ์ŠคํŠธ 0.8.0
  • ํ”Œ๋ผ์Šคํฌ-WTF 0.14.3
  • ์žฅ๊ณ  ํ™•์žฅ 2.2.8
  • ํŒŒ์ด ํ…Œ์ŠคํŠธ ํ”Œ๋ผ์Šคํฌ 0.15.1
Traceback (most recent call last):
  File "/usr/local/bin/pytest", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 73, in main
    config = _prepareconfig(args, plugins)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 224, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/usr/local/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/usr/local/lib/python3.7/site-packages/_pytest/helpconfig.py", line 89, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 794, in pytest_cmdline_parse
    self.parse(args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 1000, in parse
    self._preparse(args, addopts=addopts)
  File "/usr/local/lib/python3.7/site-packages/_pytest/config/__init__.py", line 948, in _preparse
    self.pluginmanager.load_setuptools_entrypoints("pytest11")
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 299, in load_setuptools_entrypoints
    plugin = ep.load()
  File "/usr/local/lib/python3.7/site-packages/importlib_metadata/__init__.py", line 94, in load
    module = import_module(match.group('module'))
  File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/usr/local/lib/python3.7/site-packages/_pytest/assertion/rewrite.py", line 143, in exec_module
    exec(co, module.__dict__)
  File "/usr/local/lib/python3.7/site-packages/pytest_flask/plugin.py", line 14, in <module>
    from werkzeug import cached_property
ImportError: cannot import name 'cached_property' from 'werkzeug' (/usr/local/lib/python3.7/site-packages/werkzeug/__init__.py)

๊ทธ๊ฒƒ์€ pytest-flask์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ ์—ฐ๋ฝํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. pytest-flask 0.15.1์ด ์ด๋ฏธ ์ˆ˜์ •๊ณผ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

+1, ๋‹ค์Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ:
packages/flask_wtf/recaptcha/widgets.py", line 5, in <module> from werkzeug import url_encode ImportError: cannot import name 'url_encode'

+1 ์ด ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋Š” ๋˜ํ•œ ์ข…์†์„ฑ์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. V1.0.0 ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

```์ถ”์ (๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ ๋งˆ์ง€๋ง‰):
ํŒŒ์ผ "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask/cli.py", 240ํ–‰, Locate_app
__๊ฐ€์ ธ์˜ค๊ธฐ__(๋ชจ๋“ˆ ์ด๋ฆ„)
ํŒŒ์ผ "/home/ec2-user/butter_web/butter.py", 1ํ–‰,
์•ฑ ๊ฐ€์ ธ์˜ค๊ธฐ ์•ฑ, db์—์„œ
ํŒŒ์ผ "/home/ec2-user/butter_web/app/__init__.py", 8ํ–‰,
flask_admin.contrib.sqla์—์„œ ModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/contrib/sqla/__init__.py", ๋ผ์ธ 2, in
.view์—์„œ ModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/contrib/sqla/view.py", 19ํ–‰,
flask_admin.model์—์„œ BaseModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/model/__init__.py", 2ํ–‰,
.base์—์„œ BaseModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/home/ec2-user/butter_web/venv/lib64/python3.6/site-packages/flask_admin/model/base.py", 8ํ–‰, in
werkzeug์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ secure_filename
ImportError: 'secure_filename' ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 0.16.1์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž ๊ทธ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@tjohnson4 ํ•ด์•ผ ํ•  ์ผ์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์˜ ๋‚ด ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Flask ๋ฌธ์ œ์— ๊ฒŒ์‹œํ•œ ์˜ค๋ฅ˜๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์™„์ „ํžˆ ๋”์ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋œ Flask-WTF 0.14.3์ด ๋ช‡ ์‹œ๊ฐ„ ์ „์— ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ด์— ๋Œ€ํ•œ ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์ง€์›์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ถœ์‹œํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ํŒ”๋ ˆํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ 6๊ฐœ์›” ๋ฏธ๋งŒ์— ์‹คํ–‰ํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์„ธ ๋ฒˆ์งธ๋กœ ๊นจ๋œจ๋ ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ์‚ฌํ•œ ๋ฌธ์ œ

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/ubuntu/swagger-codegen/samples/server/petstore/flaskConnexion/swagger_server/__main__.py", line 3, in <module>
    import connexion
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/__init__.py", line 3, in <module>
    from .apis import AbstractAPI  # NOQA
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/apis/__init__.py", line 1, in <module>
    from .abstract import AbstractAPI  # NOQA
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/apis/abstract.py", line 14, in <module>
    from ..operation import Operation
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/operation.py", line 7, in <module>
    from .decorators import validation
  File "/home/ubuntu/.local/lib/python3.6/site-packages/connexion/decorators/validation.py", line 9, in <module>
    from werkzeug import FileStorage
ImportError: cannot import name 'FileStorage'

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์š”๊ตฌ์‚ฌํ•ญ.txt์— werkzeug == 0.16.1 ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@Abdelsalam-Abbas ์—ฐ๊ฒฐ์€ 2019๋…„ 10์›”์— ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด์ „ ๋ฒ„์ „์„ ์‹คํ–‰ ์ค‘์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/zalando/connexion/releases/tag/2.4.0

ํ”Œ๋ผ์Šคํฌ ์„ธ์…˜์ด ์†์ƒ๋œ ๊ฒฝ์šฐ:

File "/usr/local/lib/python3.8/site-packages/flask_session/__init__.py", line 61, in init_app                                                                                                                                                                                                                               
    app.session_interface = self._get_interface(app)                                                                                                                                                                                                                                                                          
  File "/usr/local/lib/python3.8/site-packages/flask_session/__init__.py", line 90, in _get_interface                                                                                                                                                                                                                         
    session_interface = FileSystemSessionInterface(                                                                                                                                                                                                                                                                           
  File "/usr/local/lib/python3.8/site-packages/flask_session/sessions.py", line 313, in __init__                                                                                                                                                                                                                              
    from werkzeug.contrib.cache import FileSystemCache                                                                                                                                                                                                                                                                        
ModuleNotFoundError: No module named 'werkzeug.contrib'  

์š”๊ตฌ์‚ฌํ•ญ.txt์— werkzeug == 0.16.1 ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

Flask-RestPlus๊ฐ€ ๊ณ ์žฅ๋‚œ ๊ฒฝ์šฐ:

Traceback (most recent call last):
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/export/home/hysdsops/sciflo/ops/pele/app.py", line 4, in <module>
    from pele import create_app, db
  File "/export/home/hysdsops/sciflo/ops/pele/pele/__init__.py", line 5, in <module>
    from flask_restplus import apidoc
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask_restplus/__init__.py", line 4, in <module>
    from . import fields, reqparse, apidoc, inputs, cors
  File "/export/home/hysdsops/sciflo/lib/python3.7/site-packages/flask_restplus/fields.py", line 17, in <module>
    from werkzeug import cached_property
ImportError: cannot import name 'cached_property' from 'werkzeug' (/export/home/hysdsops/sciflo/lib/python3.7/site-packages/werkzeug/__init__.py)

werkzeug == 0.16.1 ๋ฅผ requirements.txt์— ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

werkzeug ์˜ LocalProxy ์—์„œ ๋ฐ˜ํ™˜๋œ ํ”Œ๋ผ์Šคํฌ ์š”์ฒญ ๊ฐ์ฒด๊ฐ€ ๋กœ์ปฌ์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ฒ„์ „์—์„œ ์˜จ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ œ๊ณตํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค ์ดํ›„๋กœ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
File "/Users/lucas/Software/anaconda3/envs/pytest/lib/python3.6/site-packages/flask/json.py", line 251, in jsonify if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] and not request.is_xhr: File "/Users/lucas/Software/anaconda3/envs/pytest/lib/python3.6/site-packages/werkzeug/local.py", line 347, in __getattr__ return getattr(self._get_current_object(), name) AttributeError: 'Request' object has no attribute 'is_xhr'

is_xhr ๋Š” Flask 1.0 ์—์„œ ์ œ๊ฑฐ๋œ ์†์„ฑ์ด์ง€๋งŒ ๋กœ์ปฌ์—๋Š” 0.12.2 ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด ๋ฒ„๊ทธ๊ฐ€ Flask์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์ด โ€‹โ€‹๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค LocalProxy ๊ฐ€ ์ด Flask ์•ฑ์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ /๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Œ€.

@LucasLLC is_xhr ๋Š” Flask์˜ ์ง์ ‘์ ์ธ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค(Flask 1.0์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค๋Š” ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณ€๊ฒฝ ๋กœ๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ์˜คํžˆ๋ ค Flask๊ฐ€ ๋…ธ์ถœํ•˜๋Š” Werkzeug API์˜€์Šต๋‹ˆ๋‹ค. Werkzeug์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด 81e10efbf3a83daf09c55cd7cc13ac6c6464d405์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ข…์†์„ฑ์„ ๊ณ ์ •ํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์‹œ ์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@pgjones ์ด์ƒ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” werkzeug๋ฅผ < 1.0.0์œผ๋กœ ๊ณ ์ •ํ•˜๋Š” flask 0.12์˜ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฆด๋ฆฌ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ Flask์˜ ์ž˜๋ชป๋œ ํ•€์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ˆ, ์ด API๋Š” ํšจ๊ณผ์ ์œผ๋กœ Flask API์ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์„œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://flask.palletsprojects.com/en/0.12.x/api/#flask.Request.is_xhr

@LucasLLC is_xhr ๋Š” Flask์˜ ์ง์ ‘์ ์ธ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค(Flask 1.0์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค๋Š” ์ฐธ์กฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณ€๊ฒฝ ๋กœ๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ์˜คํžˆ๋ ค Flask๊ฐ€ ๋…ธ์ถœํ•˜๋Š” Werkzeug API์˜€์Šต๋‹ˆ๋‹ค. Werkzeug์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด 81e10ef ์—์„œ ์ œ๊ฑฐ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„, ๋‚ด ์‹ค์ˆ˜. ๋‚˜๋Š” ์ด ๋ฐฉ๋ฒ•์—์„œ ์ƒ์„ฑ๋œ ๊ฒฝ๊ณ ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์ด Werkzeug์—์„œ ์˜จ ๊ฒƒ์ž„์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ข…์†์„ฑ์„ ๊ณ ์ •ํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์‹œ ์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ ๊ณ ๋งˆ์›Œ! ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

odoo12๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

    import werkzeug.contrib.fixers
ImportError: No module named 'werkzeug.contrib'

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Werkzeug==0.16.1

๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

ModuleNotFoundError: 'werkzeug.contrib'์ด๋ผ๋Š” ๋ชจ๋“ˆ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ”Œ๋ผ์Šคํฌ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ

Werkzeug==0.16.1 ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

```
flask_admin.contrib.sqla์—์„œ ModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/usr/local/lib/python3.6/site-packages/flask_admin/contrib/sqla/__init__.py", 2ํ–‰,

.view์—์„œ ModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/usr/local/lib/python3.6/site-packages/flask_admin/contrib/sqla/view.py", 18ํ–‰,

flask_admin.model์—์„œ BaseModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/usr/local/lib/python3.6/site-packages/flask_admin/model/__init__.py", 2ํ–‰,

.base์—์„œ BaseModelView ๊ฐ€์ ธ์˜ค๊ธฐ
ํŒŒ์ผ "/usr/local/lib/python3.6/site-packages/flask_admin/model/base.py", 8ํ–‰,

werkzeug์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ secure_filename
ImportError: 'secure_filename' ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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