0

私はWebアプリケーション開発を学んでおり、プログラムをより明確にオブジェクト指向に保ち、ナビゲート/理解を容易にするために、モジュールの分離を試みています。

Main.pyでの最初のインポートは正常に機能しています。

import jinja2
import main_page     # <<<- This import of my module works
import os
import webapp2
from string import letters

#   loads templates to make our life easier
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
                               autoescape = True)

########    Main App Function   ########
app = webapp2.WSGIApplication([('/', MainPage)], debug=True)

main_page.pyでの 2 回目のインポートが機能しません:

import main_handler  # <<< -- This import is not working

########    Implementation      ########    

#   main page handler
class MainPage(BaseHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        visits = 0
        visit_cookie_str = self.request.cookies.get('visits')
        if visit_cookie_str:
            cookie_val = check_secure_val(visit_cookie_str)
            if cookie_val:
                visits = int(cookie_val)

        visits += 1     
        new_cookie_val = make_secure_val(str(visits))
        self.response.headers.add_header('Set-Cookie', 'visits=%s' % new_cookie_val)
        self.write("You've been here %s times and this is the cookie: \n %s" % (visits, new_cookie_val))

ターミナルで次のエラーが表示されます。

ファイル "/Users/James/Developer/Google-App-Engine/Cookies/main_page.py"、6 行目、クラス MainPage(BaseHandler): NameError: name 'BaseHandler' が定義されていません

ファイル名とクラス名が他のモジュールと混同されていたので、変更してみました。ファイルはすべて同じフォルダーにあります。

This is the **main_handler.py**:

import webapp2
import string
import jinja2
import hashlib
import hmac

SECRET = "test secret"

#   global hash functions
def hash_str(s):
    return hmac.new(SECRET, s).hexdigest()

def make_secure_val(s):
    return "%s|%s" % (s, hash_str(s))

def check_secure_val(h):
    val = h.split('|')[0]
    if h == make_secure_val(val):
        return val 

#   this is a template with convenience methods
class BaseHandler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)   

    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)
4

1 に答える 1

1

「main_handler」をインポートすると、次のように使用できます。

main_handler.make_secure_val

このようではありません:

make_secure_val
于 2012-11-30T11:01:06.107 に答える