最近、Flask アプリを AWS ElasticBeanstalk にデプロイするのに苦労しています。私はウェブプロジェクトと 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 モジュールとしてロードできません。 [Wed Apr 19 00:11:57.895846 2017] [:error] mod_wsgi (pid=15947): WSGI スクリプト '/opt/python/current/app/app/members/views.py' の処理中に例外が発生しました。 [2017 年 4 月 19 日水曜日 00:11:57.895865] [:エラー] トレースバック (最後の呼び出し): [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(ルール、エンドポイント、f、**オプション) [Wed Apr 19 00:11:57.895935 2017] [:error] ファイル "/opt/python/run/venv/lib/python2.7/site-packages/flask/app.py"、行 64、wrapper_func [水4月19日 00:11:57.895944 2017] [:error] return f(self, *args, **kwargs) [Wed Apr 19 00:11:57.895949 2017] [:error] ファイル "/opt/python/run/venv /lib/python2.7/site-packages/flask/app.py", line 1051, in add_url_rule [Wed Apr 19 00:11:57.895956 2017] [:error] '既存のエンドポイント関数: %s' % エンドポイント) [ Wed Apr 19 00:11:57.895969 2017] [:error] AssertionError: ビュー関数のマッピングは既存のエンドポイント関数を上書きしています: index
私のアプリの構造は次のとおりです。
myApp/ runServer.py requirements.txt app/ __init__.py config.py static/ members/ __init__.py views.py models.py templates/
私の.ebextensions/<env-name>.config
内容:
option_settings: "aws:elasticbeanstalk:container:python": WSGIPath: app/members/views.py
最後に、私のviews.py
ファイルにはすべての URL ルーティングが含まれています。すべての関数名が同じであることを確認しました。
私が見ている問題/解決策の種類を知っている人はいますか? 助けるために提供できる情報は他にありますか?
ありがとう!
編集:def index()
関数views.py
をdef newFunctionForTesting()
yieldsに変更するAssertionError: View function mapping is overwriting an existing endpoint function: newFunctionForTesting
編集2:それはに類似していてもよい、この1が、その場合には提案された解決策は、私が...たぶん青写真がより良い仕事ができる探していたアプローチではありません1つのファイルに書き込み、すべて、したこと...
編集 3:これが私のアプリの外観です。
app\__init__.py
フラスコから import Flask, flash, urlparseからのリクエストimport urlparse, urljoin from urllib2 import urlopen from フラスコ_user import SQLAlchemyAdapter, UserManager, current_user import os from apscheduler.schedulers.background import BackgroundScheduler import pandas as pd from app.members.models import db, User , AcademicData, Role, UserRoles, passlib.hash からのクエリ import bcrypt import datetime import json # アプリケーションの初期化 application = Flask(__name__) application.config.from_object(" app.config.Config ") # db の初期化 db.init_app(application) # application.app_context() でユーザーモデルを db に登録します: db.create_all() # 定義されたテーブルを作成します db_adapter = SQLAlchemyAdapter(db, User) # ユーザーモデルを登録します @application.before_first_request def initialize(): scheduler = BackgroundScheduler() スケジューラ.start() scheduler.add_job(updateData, trigger = "interval", days = 1) def updateData(): ... @application.context_processor def injectFunction(): def getDataTable(id): ... import 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 からのリクエスト import login_required、roles_required、user_views としての アプリのインポート アプリケーション、SITE_ROOT import json import os import pandas as pd @application.route('/') def index(): "" " インデックスビュー。現在のダッシュボード。 :return: """ return redirect(url_for('dashboard')) @application.route('/dashboard') @login_required def dashboard(): ... return render_template('dashboard. html') @application.ルート('/テーブル')) @login_required def table(): return render_template('table.html') @application.errorhandler(404) def not_found(error): return render_template('404.html') @application.errorhandler(500) @application.errorhandler(503) def server_error(error) : return render_template('503.html') @roles_required('admin') def protected_register(): return user_views.register()
私はこの例に従ってWSGIPath を設定していましたが、@davidism がそれを指摘したので、別のアプローチを試したところうまくいきました。私が作成したapp.wsgi
基本的にはちょうど私のアプリケーションオブジェクトとセットをインポートファイルWSGIPath: app/app.wsgi
の私には.ebextensions/<env-name>.config
。これで、アプリケーションは Elastic Beanstalk を介して正常にデプロイおよび起動されます。静的リソースが機能しなくなりConfiguration > Software Configuration > Static Files
ましたが、Elastic Beanstalk コンソールで静的フォルダーのマッピングを更新する必要がありました。
ありがとう!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加