0

我正在尝试从 web.py 食谱中复制并使用示例“使用 PostgreSQL 数据库进行用户身份验证”。我无法弄清楚为什么我会收到以下错误。

  1. 在 /login 'ThreadedDict' 对象没有属性 'login'

  2. 在 /login 'ThreadedDict' 对象没有属性 'privilege'

这是第二个错误的错误输出到终端。(第一个几乎相同)

回溯(最近一次通话最后):
  文件“/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 行,在句柄中
    返回 self._delegate(fn, self.fvars, args)
  _delegate 中的文件“/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py”,第 420 行
    返回句柄类(cls)
  文件“/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py”,第 396 行,在 handle_class
    返回调用(*args)
  文件“/home/erik/Dropbox/Python/Web.py/Code.py”,第 44 行,在 GET
    渲染 = create_render(session.privilege)
  文件“/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/session.py”,第 71 行,在 __getattr__
    返回 getattr(self._data, name)
AttributeError:“ThreadedDict”对象没有属性“特权”

127.0.0.1:36420 - - [25/Aug/2012 01:12:38] “HTTP/1.1 GET /login” - 500 内部服务器错误

这是我的 code.py 文件。几乎是从食谱上剪下来的。我尝试将所有类和 def 放在主代码之上。如另一篇文章中所述,我还尝试使用 sudo 启动 python。

导入网页

班级指数:
    定义获取(自我):
        todos = db.select('todo')
        返回 render.index(todos)

类添加:
    def POST(自我):
        i = web.input()
        n = db.insert('todo', title=i.title)
        raise web.seeother('/')

定义记录():
    return False #我添加这个来测试错误 #1,现在我得到错误 #2
    #if session.login==1:
    # 返回真
    #别的:
    # 返回错误

def create_render(特权):
    如果记录():
        如果特权 == 0:
            渲染 = web.template.render('模板/阅读器')
        elif 特权 == 1:
            渲染 = web.template.render('模板/用户')
        elif 特权 == 2:
            渲染 = web.template.render('模板/管理员')
        别的:
            渲染 = web.template.render('templates/communs')
    别的:
        渲染 = web.template.render('templates/communs')
    返回渲染



班级登录:

    定义获取(自我):
        如果记录():
            渲染 = create_render(session.privilege)
            return '%s' % render.login_double()
        别的:
            # 这是错误#2的地方
            渲染 = create_render(session.privilege)
            return '%s' % render.login()

    def POST(自我):
        名称,密码 = web.input().name,web.input().passwd
        ident = db.select('users', where='name=$name', vars=locals())[0]
        尝试:
            如果 hashlib.sha1("sAlT754-"+passwd).hexdigest() == ident['pass']:
                session.login = 1
                session.privilege = ident['特权']
                渲染 = create_render(session.privilege)
                返回 render.login_ok()
            别的:
                session.login = 0
                session.privilege = 0
                渲染 = create_render(session.privilege)
                返回 render.login_error()
        除了:
            session.login = 0
            session.privilege = 0
            渲染 = create_render(session.privilege)
            返回 render.login_error()


类重置:

    定义获取(自我):
        session.login = 0
        session.kill()
        渲染 = create_render(session.privilege)
        返回render.logout()




#web.config.debug = 假

render = web.template.render('templates/', base='layout')
网址 = (
    '/', '指数',
    '/添加', '添加',
    '/登录', '登录',
    '/重置', '重置'
    )

app = web.application(urls, globals())
db = web.database(dbn='postgres', user='hdsfgsdfgsd', pw='dfgsdfgsdfg', db='postgres', host='fdfgdfgd.com')

存储 = web.session.DiskStore('会话')

# 太我了,这似乎被忽略了,至少是“初始化器”部分
session = web.session.Session(app, store, initializer={'login': 0, 'privilege': 0})



如果 __name__ == "__main__": app.run()
4

1 回答 1

0

好的,我能够弄清楚我做错了什么。全部新手资料和学习过程的所有部分。这段代码现在可以正常工作,而且大部分时间都很好。我坚持的部分现在正在工作。在代码中查看我的评论

谢谢

导入网页

web.config.debug = 假

render = web.template.render('templates/', base='layout')
网址 = (
    '/', '指数',
    '/添加', '添加',
    '/登录', '登录',
    '/重置', '重置'
    )

app = web.application(urls, globals())
db = web.database(废话,废话,废话)

存储 = web.session.DiskStore('会话')
session = web.session.Session(app, store, initializer={'login': 0, 'privilege': 0})


班级指数:
    定义获取(自我):
        todos = db.select('todo')
        返回 render.index(todos)

类添加:
    def POST(自我):
        i = web.input()
        n = db.insert('todo', title=i.title)
        raise web.seeother('/')

定义记录():
    如果 session.get('login', False):
        返回真
    别的:
        返回假

def create_render(特权):
    如果记录():
        如果特权 == 0:
            渲染 = web.template.render('模板/阅读器')
        elif 特权 == 1:
            渲染 = web.template.render('模板/用户')
        elif 特权 == 2:
            渲染 = web.template.render('模板/管理员')
        别的:
            渲染 = web.template.render('templates/communs')
    别的:
                ## 这行是关键,我没有 communs 文件夹,因此返回了一个不可用的对象
        #render = web.template.render('templates/communs') #示例中的原始代码

        render = web.template.render('templates/', base='layout')
    返回渲染



班级登录:

    定义获取(自我):
        如果记录():
                        ## 使用 session.get('something') 代替 session.something 在不退出时不会爆炸
            渲染 = create_render(session.get('privilege'))
            return '%s' % render.login_double()
        别的:
            渲染 = create_render(session.get('privilege'))
            return '%s' % render.login()

    def POST(自我):
        名称,密码 = web.input().name,web.input().passwd
        ident = db.select('users', where='name=$name', vars=locals())[0]
        尝试:
            如果 hashlib.sha1("sAlT754-"+passwd).hexdigest() == ident['pass']:
                session.login = 1
                session.privilege = ident['特权']
                渲染 = create_render(session.get('privilege'))
                返回 render.login_ok()
            别的:
                session.login = 0
                session.privilege = 0
                渲染 = create_render(session.get('privilege'))
                返回 render.login_error()
        除了:
            session.login = 0
            session.privilege = 0
            渲染 = create_render(session.get('privilege'))
            返回 render.login_error()


类重置:

    定义获取(自我):
        session.login = 0
        session.kill()
        渲染 = create_render(session.get('privilege'))
        返回render.logout()


如果 __name__ == "__main__": app.run()

于 2012-08-27T07:32:08.997 回答