1

別のサブドメインでホストされている、メインの GAE アプリケーション内で多かれ少なかれ分離されたアプリをサポートしようとしています。

このサブドメインのハンドラーを「oficina」フォルダー内の「mediciones.py」ファイルに入れました。

ので、私は持っています:

  1. /main.py
  2. /oficina/mediciones.py
  3. そしてmediciones.py内:
class Router(webapp2.RequestHandler):
    def get(self):
      [... code ...]

class Listado(webapp.RequestHandler):
    def get(self):
      [... code ...]

必要なすべてのハンドラーなど。

「main.py」の内部:

application = webapp2.WSGIApplication([
    DomainRoute('ventas.domain.com',
        [webapp2.Route(r'/nueva', handler='oficina.mediciones.MedicionNueva', name="nueva-medicion"),
         webapp2.Route(r'/listado', handler="oficina.mediciones.Listado", name="listado-mediciones"),
         webapp2.Route(r'/medicion/(\d+)/', handler="oficina.mediciones.MedicionDetalles", name="detalles-mediciones"),
         webapp2.Route(r'/rellenar_medicion/(\d+)/', handler="oficina.mediciones.MedicionRellenar", name="rellenar-medicion"),
         webapp2.Route(r'/editar_medicion/(\d+)/', handler="oficina.mediciones.MedicionEditar", name="editar-medicion"),
         webapp2.Route('/', handler="oficina.mediciones.Router")
        ]),
('/(.+)',
     DirectView),
    ('/?',
        HomeView),
    ], debug=True)

しかし、ventas.domain.com または ventas.domain.com/listado にアクセスしようとすると、次のようになります。

Traceback (most recent call last):
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1272, in default_dispatcher
    self.handlers[handler] = handler = import_string(handler)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1851, in import_string
    return getattr(__import__(module, None, None, [obj]), obj)
ImportStringError: import_string() failed for 'oficina.mediciones.Router'. Possible reasons are:

- missing __init__.py in a package;
- package or module path not included in sys.path;
- duplicated package or module name taking precedence in sys.path;
- missing module, class, function or variable;

Original exception:

AttributeError: 'module' object has no attribute 'Router'

Debugged import:

- 'oficina' found in '/base/data/home/apps/s~pavimentos-arquiservi-web-hrd/11-0-0.361841284178483516/oficina/__init__.pyc'.
- 'oficina.mediciones' found in '/base/data/home/apps/s~pavimentos-arquiservi-web-hrd/11-0-0.361841284178483516/oficina/mediciones/__init__.pyc'.
- 'oficina.mediciones.Router' not found.

(「Router」を「Listado」に置き換えるか、状況ごとに適切なハンドラーに置き換えます)。

ハンドラーは定義されていますが、その場所でハンドラーが見つからないのはなぜですか?

4

1 に答える 1

1

アプリが本当に自己完結型である場合は、ハンドラーを別のモジュールに分割する別の方法を検討することもできます。app.yamlで、別のURLプレフィックスを定義し、別のモジュールで処理することができます。

例えば

- url: /oficina/.*
  script: ofinina.mediciones.py

- url: /.*
  script: main.py

残念ながら、これらのルートをドメイン名だけで区切ることはできないため、要件によっては、これを選択できない場合があります。

別の方法として、ハンドラーに文字列名を使用する代わりに、必要なパッケージをmain.pyにインポートして、クラス名を直接使用することができます。これにより、パッケージの自己完結が減少します。しかし、繰り返しになりますが、文字列リテラルによるクラス名の参照も同様です。

于 2012-09-18T11:50:07.490 に答える