2์๊ฐ ์ ์ ํธ์๋ 1.0.0 ๋ฆด๋ฆฌ์ค๋ flask๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ํ์ต๋๋ค. ์ํ๋ ํจ๊ณผ์ธ์ง ํ๋ผ์คํฌ๊ฐ ๋ฒ์ ์ ๊ณ ์ ํด์ผ ํ๋์ง ๋๋ ์ด ํ๋ก์ ํธ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํด์ผ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ์ญ์ถ์ ์ ๊ฒ์ํ์ญ์์ค.
์ด ๋ฌธ์ ๋ Flask์ ์๋ ๊ฒ์ด ์๋๋ฉฐ Werkzeug๋ ์ด๋ฌํ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ณ์ ์ง์ํ์ง ์์ต๋๋ค. 0.16์ 5๊ฐ์ ๋์ ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ์ต๋๋ค. ํด๋น ๋ฒ์ ์ ์ค๊ฐ ๋จ๊ณ๋ก ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ณํฉ๋๋ค.
์ด์๋ฅผ ์ด๊ฑฐ๋ ๊ด๋ จ ํ๋ก์ ํธ์์ PR์ ์ ์ถํ์ฌ ํ์ฅ ๋ฐ ๊ธฐํ ํ๋ก์ ํธ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
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' ์ด๋ฆ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ์์ ํ ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋๋ค. ์์ ์ฌํญ์ด ํฌํจ๋ Flask-WTF 0.14.3์ด ๋ช ์๊ฐ ์ ์ ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค. ์ํ๊ณ์ ๋ง์ ๋ถ๋ถ์ด ์ด์ ๋ํ ์ค๋น๊ฐ ๋์ง ์์์ ๋ ์ง์์ ์ ๊ฑฐํ๋ ๋ฆด๋ฆฌ์ค๋ฅผ ์ด๋ป๊ฒ ์ถ์ํฉ๋๊น?
์ด๊ฒ์ ํ๋ ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ 6๊ฐ์ ๋ฏธ๋ง์ ์คํํ๋ ์ฝ๋๋ฅผ ์ธ ๋ฒ์งธ๋ก ๊นจ๋จ๋ ธ๋ค๊ณ ์๊ฐํฉ๋๋ค.