0

web.pyクックブックから「PostgreSQLデータベースを使用したユーザー認証」の例をコピーして使用しようとしています。次のエラーが発生する理由がわかりません。

  1. /login で 'ThreadedDict' オブジェクトに属性 'login' がありません

  2. /login で 'ThreadedDict' オブジェクトに属性 'privilege' がありません

2 番目のエラーの端末へのエラー出力を次に示します。(最初はほぼ同じ)

トレースバック (最新の呼び出しが最後):
  ファイル「/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py」、239行目、処理中
    self.handle() を返す
  ファイル「/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py」、230行目、ハンドル
    return self._delegate(fn, self.fvars, args)
  ファイル "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py"、420 ​​行目、_delegate 内
    戻りハンドルクラス (cls)
  ファイル "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py"、396 行目、handle_class 内
    return tocall(*args)
  ファイル「/home/erik/Dropbox/Python/Web.py/Code.py」、44 行目、GET
    render = create_render(session.privilege)
  ファイル "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/session.py"、71 行目、__getattr__ 内
    return getattr(self._data, name)
AttributeError: 'ThreadedDict' オブジェクトには属性 'privilege' がありません

127.0.0.1:36420 - - [2012 年 8 月 25 日 01:12:38] "HTTP/1.1 GET /login" - 500 内部サーバー エラー

これが私のcode.pyファイルです。クックブックからのカットアンドペーストです。すべてのクラスと定義をメイン コードの上に置いてみました。また、別の投稿で述べたように、sudo を使用して python を起動しようとしました。

ウェブをインポート

クラス インデックス:
    デフGET(自己):
        todos = db.select('todo')
        render.index(todos) を返す

クラス追加:
    デフポスト(自己):
        i = web.input()
        n = db.insert('todo', title=i.title)
        web.seeother('/') を上げる

デフログ():
    return False #これをテスト エラー #1 に追加しましたが、エラー #2 が発生します
    #if session.login==1:
    # 真を返す
    #そうしないと:
    # 偽を返す

def create_render(権限):
    記録された場合():
        特権 == 0 の場合:
            render = web.template.render('テンプレート/リーダー')
        elif 特権 == 1:
            render = web.template.render('テンプレート/ユーザー')
        elif 特権 == 2:
            render = web.template.render('テンプレート/管理者')
        そうしないと:
            render = web.template.render('templates/communs')
    そうしないと:
        render = web.template.render('templates/communs')
    レンダーを返す



クラスログイン:

    デフGET(自己):
        記録された場合():
            render = create_render(session.privilege)
            return '%s' % render.login_double()
        そうしないと:
            # これがエラー #2 の場所です
            render = create_render(session.privilege)
            return '%s' % render.login()

    デフポスト(自己):
        name, passwd = web.input().name, web.input().passwd
        ident = db.select('users', where='name=$name', vars=locals())[0]
        試す:
            もし hashlib.sha1("sAlT754-"+passwd).hexdigest() == ident['pass']:
                セッション。ログイン = 1
                session.privilege = ident['特権']
                render = create_render(session.privilege)
                render.login_ok() を返す
            そうしないと:
                セッション。ログイン = 0
                セッション。特権 = 0
                render = create_render(session.privilege)
                render.login_error() を返す
        を除外する:
            セッション。ログイン = 0
            セッション。特権 = 0
            render = create_render(session.privilege)
            render.login_error() を返す


クラスのリセット:

    デフGET(自己):
        セッション。ログイン = 0
        session.kill()
        render = create_render(session.privilege)
        render.logout() を返す




#web.config.debug = False

render = web.template.render('templates/', base='layout')
URL = (
    '/'、 '索引'、
    「/追加」、「追加」、
    「/ログイン」、「ログイン」、
    「/リセット」、「リセット」
    )

app = web.application(urls, globals())
デシベル = web.database (dbn = 'postgres'、ユーザー = 'hdsfgsdfgsd'、pw = 'dfgsdfgsdfg'、db = 'postgres'、ホスト = 'fdfgdfgd.com')

store = web.session.DiskStore('セッション')

#あまりにも、これは無視されているようです、少なくとも「初期化子」の部分
セッション = web.session.Session(アプリ、ストア、イニシャライザー={'ログイン': 0、'特権': 0})



if __name__ == "__main__": app.run()
4

1 に答える 1

0

さて、私は自分が間違ったことを理解することができました。初心者向けのものと学習プロセスのすべての部分。このコードは現在、ほとんどの場合うまく機能しています。私が立ち往生していた部分は現在機能しています。コード内の私のコメントを参照してください

ありがとう

ウェブをインポート

web.config.debug = False

render = web.template.render('templates /'、base ='layout')
urls =(
    '/'、 '索引'、
    '/ add'、'add'、
    '/ login'、'Login'、
    '/ reset'、'Reset'
    )。

app = web.application(urls、globals())
db = web.database(何とか、何とか、何とか)

store = web.session.DiskStore('sessions')
session = web.session.Session(app、store、initializer = {'login':0、'privilege':0})


クラスインデックス:
    def GET(self):
        todos = db.select('todo')
        render.index(todos)を返します

クラス追加:
    def POST(self):
        i = web.input()
        n = db.insert('todo'、title = i.title)
        web.seeother('/')を上げる

deflogged():
    session.get('login'、False)の場合:
        Trueを返す
    そうしないと:
        Falseを返します

def create_render(privilege):
    loged()の場合:
        特権==0の場合:
            render = web.template.render('templates / reader')
        elif特権==1:
            render = web.template.render('templates / user')
        elif特権==2:
            render = web.template.render('templates / admin')
        そうしないと:
            render = web.template.render('templates / communs')
    そうしないと:
                ##この行は重要です、私はcommunsフォルダーを持っていないので、使用できないオブジェクトを返します
        #render = web.template.render('templates / communs')#例の元のコード

        render = web.template.render('templates /'、base ='layout')
    レンダリングを返す



クラスログイン:

    def GET(self):
        loged()の場合:
                        ## session.somethingの代わりにsession.get('something')を使用すると、終了しないときに爆発しません
            render = create_render(session.get('privilege'))
            '%s'%render.login_double()を返します
        そうしないと:
            render = create_render(session.get('privilege'))
            '%s'%render.login()を返します

    def POST(self):
        name、passwd = web.input()。name、web.input()。passwd
        ident = db.select('users'、where ='name = $ name'、vars = locals())[0]
        試す:
            if hashlib.sha1( "sAlT754-" + passwd).hexdigest()== ident ['pass']:
                session.login = 1
                session.privilege = ident ['privilege']
                render = create_render(session.get('privilege'))
                render.login_ok()を返します
            そうしないと:
                session.login = 0
                session.privilege = 0
                render = create_render(session.get('privilege'))
                render.login_error()を返します
        それ外:
            session.login = 0
            session.privilege = 0
            render = create_render(session.get('privilege'))
            render.login_error()を返します


クラスリセット:

    def GET(self):
        session.login = 0
        session.kill()
        render = create_render(session.get('privilege'))
        render.logout()を返します


if __name__ == "__main __":app.run()

于 2012-08-27T07:32:08.997 に答える