使用web.py登录和注销

时间:2013-11-22 12:11:55

标签: python session web.py

我对web.py有点问题。我的会话有问题。

链接到我的应用: http://len.iem.pw.edu.pl/~witkowr1/apps/demo/

登录/密码:wtq / wtq

代码:

    # -*- coding: utf-8 -*- 
import web 
import json
from web.contrib.template import render_jinja
import datetime

prefix = '/~witkowr1/apps/demo'

urls = (
    prefix + '/login','Login',
    prefix + '/logout','Logout',
    prefix + '/', 'Index',
)

app = web.application(urls, globals())
wsgi = app.wsgifunc()
session = web.session.Session(app, web.session.DiskStore('sessions'),initializer={'time':datetime.datetime.now()})
render = render_jinja('static', encoding = 'utf-8')
render._lookup.globals.update(assets=prefix+'/static')

class Login:
    def GET(self):
    web.seeother(prefix+'/')

    def POST(self):
        login = web.input().login
    password = web.input().passwd
    if login == 'wtq' and password == 'wtq':
            session.logged_in = True
            session.time = datetime.datetime.now()
            last_login = web.cookies().get('time')
            if last_login == None:
                last_login_data = u'Zalogowałeś się pierwszy raz.'
            else:
                last_login_data = last_login
        return render.logged(name=login, date_last_login=last_login_data)
        else:
            session.logged_in = False
        error=u'Niepoprawne dane. SprĂłbuj jeszcze raz.'
            return render.login(error_msg=error)

class Logout:
    def GET(self):
        web.seeother(prefix+'/')

    def POST(self):
        session.logged_in = False
        web.setcookie('time',session.time)
        message = u'Zostałeś poprawnie wylogowany.'
        session.kill()
        return render.login(error_msg=message)

class Index:
    def GET(self):
        return render.login()

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

我想验证会话,如果我提前登录,我会看到最新登录日期的网站。 现在,当我刷新网站时,我必须再次登录。 我想,当我渲染HTML网站时,我检查会话,但我不知道,我做了什么。

请帮忙!

4 个答案:

答案 0 :(得分:0)

这里的问题是,如果他们使用GET方法访问页面,则不会检查他们是否已登录。

您需要进行如下更改:

def GET(self):
    if session.logged_in:
        last_login = web.cookies().get('time')
        if last_login == None:
            last_login_data = u'Zalogowałeś się pierwszy raz.'
        else:
            last_login_data = last_login
        return render.logged(name=login, date_last_login=last_login_data)
    else:
        web.seeother(prefix+'/')

但是你应该重写这一点,以便在你登录后被带到另一个页面,并且该页面负责呈现这些信息。您的应用程序结构有很大的改进空间。

也就是说,简单的答案是 - 即使您存储会话,登录的“GET”方法完全不知道会话,并且将始终返回登录提示。

答案 1 :(得分:0)

不确定你是否已经解决了你的问题,但由于看起来web.py中的会话经常出现问题,我把它的一个小而简单的演示推到了bitbucket。对我来说很好,所以希望这对你有用。

您可以通过以下方式获取:

git clone https://victorkohler@bitbucket.org/victorkohler/webpy-login.git

答案 2 :(得分:0)

我解决了我的问题。 非常愚蠢的错误:)

代码:

# -*- coding: utf-8 -*- 
import web 
from web.contrib.template import render_jinja
import datetime

prefix = ''

urls = (
    prefix + '/', 'Index',
    prefix + '/login','Login',
    prefix + '/logout','Logout',
)

app = web.application(urls, globals())
wsgi = app.wsgifunc()
web.config.debug = False
session = web.session.Session(app, web.session.DiskStore('sessions'),initializer={'time':datetime.datetime.now()})
render = render_jinja('static', encoding = 'utf-8')
render._lookup.globals.update(assets=prefix+'/static')

allowed = (
    ('user','user'),
)

class Login:

    def GET(self):
        web.seeother(prefix+'/')

    def POST(self):
        login = web.input().login
        passwd = web.input().passwd
        if(login,passwd) in allowed:
            session.logged_in = True
        session.login = login
            session.time = datetime.datetime.now()
            last_login = web.cookies().get('time')
            if last_login == None:
                last_login_data = u'Zalogowałeś się pierwszy raz.'
            else:
                last_login_data = last_login
            return render.logged(name=login, date_last_login = last_login_data)
        else:
            session.logged_in = False
        error=u'Niepoprawne dane. Spróbuj jeszcze raz.'
            return render.login(error_msg=error)

class Logout:
    def GET(self):
        web.seeother(prefix+'/')

    def POST(self):
        session.logged_in = False
        web.setcookie('time',session.time)
        message = u'Zostałeś poprawnie wylogowany.'
        session.kill()
        return render.login(error_msg=message)

class Index:
    def GET(self):
        if session.get ('logged_in') == True: 
            last_login = web.cookies().get('time')
            if last_login == None:
                last_login_data = u'Zalogowałeś się pierwszy raz.'
            else:
                last_login_data = last_login
            return render.logged(name=session.get ('login'), date_last_login = last_login_data)
    else:
            return render.login()

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

答案 3 :(得分:0)

这不是您问题的答案,而是问题的扩展。我有一个类似于webpy cookbook(http://webpy.org/cookbook/userauthbasic)登录的解决方案,但是想加载数据库允许的变量。

allowed = (
    ('user','user'),
)

当我尝试读取将值赋给变量时,在登录类中执行时,它会显示为“无”。

def readUsersDb(): 
    def POST(self):
        # load user data into allowed variable
        usersDbFilePath = 'userdata/irf/default/'
        usersDbFile = 'usersDb.db'
        usersDbFilePath = usersDbFilePath + usersDbFile

        conn = sqlite3.connect(usersDbFilePath)
        c = conn.cursor()

        c.execute('SELECT * FROM users')
        output = c.fetchall()
        conn.close()
        global allowed
        allowed = output
readUsersDb()

当允许的变量是硬编码时的登录功能。我使用了数据库读取的格式,它仍然按预期运行,因此它不是格式问题。

#response: [(u'user1', 'user1'), (u'user2', 'user2'), (u'user3', 'user3')]

希望有人曾试图这样做。如果将问题添加为答案是一种失礼,我会提前道歉。