1

我想为 WEB“WSGI pep 3333”API 遵循这个结构(教育目的):

/home/
 `--app.py
 `--API_module/
    `--__init__.py
    `--api.py
    `--exceptions.py
 `--modules/
     `--default/
        `--__init__.py
         `--default.py

app.py调用API_module类似:

app = API_module.api()

基于api.py“HTTP GET 请求”将加载存储在名为 目录的模块modules,现在,我只是加载一个名为default.

api.py好像:

import os
import imp
from exceptions import HTTPError, HTTPException

class API(object):
    def __call__(self, env, start_response):
        self.env = env
        self.method = env['REQUEST_METHOD']
        try:
            body = self.router()
            body.dispatch()
        except HTTPError, e:
             print 'HTTP method not valid %s' % e
        except, Exception e:
             print 'something went wrong'

        start_response(status, headers)
        yield body

     def router():
         module_path = '/home/modules/default/default.py'
         if not os.access(module_path, os.R_OK):
             raise HTTPException()
         else:
             py_mod = imp.load_source('default', '/home/modules/default/default.py'
             return py_mod.Resource(self)

default.py包含以下内容:

class Resoure(object):
    def __init__(self, app):
        self.app = app

    def dispatch(self):
       raise HTTPException()

到目前为止,我可以动态导入模块,但如果我想从default.py模块中引发异常,我会得到:

未定义全局名称“HTTPException”

因此我想知道,如何API_module/exceptions在所有动态模块中利用和使用它们。

欢迎任何想法,建议评论。

4

1 回答 1

2

这是一个问题sys.path

在您的设置中,由于您API_module包含在您的应用程序中,因此您应该以通常的方式包含app.py应用程序的根目录:sys.pathAPI_module

from API_module import exceptions

或者

from API_module.exceptions import *

取决于你如何使用它。

顺便说一句,我建议你使用pymod = __import__('modules.default.default', fromlist=[''])并放置一个__init__.py' file in themodules/` 根目录。

于 2013-11-04T14:53:34.373 回答