在 EB 上部署结构化 Flask 应用程序 - 查看函数映射错误

Posted

技术标签:

【中文标题】在 EB 上部署结构化 Flask 应用程序 - 查看函数映射错误【英文标题】:Deploying structured Flask app on EB - View function mapping error 【发布时间】:2017-09-15 00:16:18 【问题描述】:

我最近一直在努力将我的 Flask 应用程序部署到 AWS ElasticBeanstalk。我对 Web 项目和 AWS 还很陌生,所以每天都很艰难。每隔一段时间,我都会将我的项目部署到 EB(过去我能够解决问题),但是自从我将我的应用程序从单一的 application.py 重组为更结构化的方法后,我一直在苦苦挣扎。部署本身已成功,但我面临 500 错误。日志说:

[Wed Apr 19 00:11:57.895790 2017] [:error] mod_wsgi (pid=15947): 目标 WSGI 脚本 '/opt/python/current/app/app/members/views.py' 不能作为 Python 模块加载。 [2017 年 4 月 19 日星期三 00:11:57.895846] [:error] mod_wsgi (pid=15947):处理 WSGI 脚本“/opt/python/current/app/app/members/views.py”时发生异常。 [2017 年 4 月 19 日星期三 00:11:57.895865] [:error] Traceback(最近一次通话最后一次): [2017 年 4 月 19 日星期三 00:11:57.895881] [:error] 文件“/opt/python/current/app/app/members/views.py”,第 14 行,在 [2017 年 4 月 19 日星期三 00:11:57.895903] [:error] @application.route('/') [2017 年 4 月 19 日星期三 00:11:57.895909] [:error] 文件“/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py”,第 1080 行,在装饰器中 [2017 年 4 月 19 日星期三 00:11:57.895921] [:error] self.add_url_rule(rule, endpoint, f, **options) [Wed Apr 19 00:11:57.895935 2017] [:error] 文件“/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py”,第 64 行,在 wrapper_func [2017 年 4 月 19 日星期三 00:11:57.895944] [:error] return f(self, *args, **kwargs) [2017 年 4 月 19 日星期三 00:11:57.895949] [:error] 文件“/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py”,第 1051 行,在 add_url_rule [Wed Apr 19 00:11:57.895956 2017] [:error] 'existing endpoint function: %s' % endpoint) [Wed Apr 19 00:11:57.895969 2017] [:error] AssertionError: View function mapping is overwritten an existing endpoint function: index

我的应用结构是:

我的应用程序/ 运行服务器.py 要求.txt 应用程序/ __init__.py 配置文件 静止的/ 会员/ __init__.py 视图.py 模型.py 模板/

我的.ebextensions/<env-name>.config 包含:

选项设置: “aws:elasticbeanstalk:容器:python”: WSGIPath:app/members/views.py

最后,我的views.py 文件包含我所有的 url 路由。我已经确定所有的函数名都是一样的。

有人知道我正在寻找什么样的问题/解决方案吗?我可以提供更多信息来提供帮助吗?

谢谢!

编辑:views.py中的def index()函数更改为def newFunctionForTesting()会产生AssertionError: View function mapping is overwriting an existing endpoint function: newFunctionForTesting

编辑 2: 它可能类似于 this one,但在这种情况下,建议的解决方案是将所有内容写入一个文件中,这不是我正在寻找的方法.. . 也许蓝图可以更好地工作...

编辑 3:这是我的应用的外观。

app\__init__.py

从烧瓶进口烧瓶,闪光,请求 从 urlparse 导入 urlparse, urljoin 从 urllib2 导入 urlopen 从 flask_user 导入 SQLAlchemyAdapter、UserManager、current_user 导入操作系统 从 apscheduler.scheduler.background 导入 BackgroundScheduler 将熊猫导入为 pd 从 app.members.models 导入数据库、用户、学术数据、角色、用户角色、查询 从 passlib.hash 导入 bcrypt 导入日期时间 导入json # 初始化应用程序 应用程序 = Flask(__name__) application.config.from_object("app.config.Config") # 初始化数据库 db.init_app(应用程序) # 向 db 注册用户模型 使用 application.app_context(): db.create_all() # 创建定义的表 db_adapter = SQLAlchemyAdapter(db, User) # 注册用户模型 @application.before_first_request 定义初始化(): 调度器 = 背景调度器() 调度程序.start() scheduler.add_job(updateData, trigger = "interval", days = 1) 定义更新数据(): ... @application.context_processor 定义注入函数(): 定义 getDataTable(id): ... 导入 members.views # 初始化烧瓶用户 user_manager = UserManager(db_adapter, application,register_view_function = members.views.protected_register)

app\members\views.py

从烧瓶导入重定向,url_for,render_template,请求 从 flask_user 导入 login_required,roles_required,以 user_views 身份查看 从应用程序导入应用程序,SITE_ROOT 导入json 导入操作系统 将熊猫导入为 pd @application.route('/') 定义索引(): """ 索引视图。目前是仪表板。 :返回: """ 返回重定向(url_for('仪表板')) @application.route('/dashboard') @需要登录 定义仪表板(): ... 返回渲染模板('dashboard.html') @application.route('/table') @需要登录 定义表(): 返回渲染模板('table.html') @application.errorhandler(404) def not_found(错误): 返回渲染模板('404.html') @application.errorhandler(500) @application.errorhandler(503) def server_error(错误): 返回渲染模板('503.html') @roles_required('管理员') def protected_register(): 返回 user_views.register()

【问题讨论】:

错误显示AssertionError: View function mapping is overwriting an existing endpoint function: index - 您是否从任何地方导入views.py 中的app,并且(无论哪种方式)您是否在任何地方的名为index 的函数上定义另一条路线(无论URL 是否不同,函数的名称是什么)。 views.py之外没有路由(至少我没有定义),项目中也没有其他名为index的函数。我为路由选择from app import applicationimport app。最后一次导入是访问共享全局变量的临时措施。这似乎是一种可怕的模式,并且会及时改变。我还应该提到,该应用程序可以在本地与内置服务器一起正常工作。 感谢您对 Flask 的投入和工作。我将处理这个例子,并在我拥有它后包含一个。我检查了所有视图功能和路线,没有冲突。当使用 Flask 的内置服务器运行时,不会发生这种情况。我以前犯过这个错误(这给了我内置服务器的错误),但至少现在不是那种不小心将两个视图函数命名为相同的错误。也许这与在我的__init.py__ 底部包含views.py 和在views.py 中包含app 有关? views.py 中的def index() 函数更改为def newFunctionForTesting() 会产生AssertionError: View function mapping is overwriting an existing endpoint function: newFunctionForTesting。为了以防万一,我还从views.py 中删除了import app 【参考方案1】:

我按照this 示例来设置我的WSGIPath,但由于@davidism 指出了这一点,我尝试了一种不同的方法并且它奏效了。我创建了一个app.wsgi 文件,它基本上只是导入我的应用程序对象并在我的.ebextensions/<env-name>.config 中设置WSGIPath: app/app.wsgi。该应用程序现在通过 Elastic Beanstalk 成功部署和启动。我的静态资源停止工作,但我必须在 Elastic Beanstalk 控制台中更新 Configuration > Software Configuration > Static Files 下的静态文件夹的映射。

谢谢!

【讨论】:

以上是关于在 EB 上部署结构化 Flask 应用程序 - 查看函数映射错误的主要内容,如果未能解决你的问题,请参考以下文章

flask项目在Linux上部署

在Azure上使用OpenCV部署Python Flask应用的最佳方法

在 ec2 实例中部署 eb 后,ruby 应用程序 aws 数据丢失

在 Elastic BeanStalk 上部署 Flask 应用程序时遇到问题

如何在服务器上部署Flask应用——Linux篇

在 Heroku 上部署 Flask Websockets 应用程序时遇到问题