繁体   English   中英

使用web.py登录和注销

[英]Login and logout with 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网站时会检查会话,但我不知道该怎么做。

请帮忙!

这里的问题是,如果他们使用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”登录方法也完全不知道会话,并且将始终返回登录提示。

不知道您是否已经解决了问题,但是由于看起来好像web.py中的会话经常出现问题,所以我将它的一个小而粗略的演示推送到了bitbucket。 对我来说效果很好,所以希望对您有用。

您可以通过以下方式获得它:

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

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

码:

# -*- 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()

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

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

当我尝试通过读取将值分配给变量时,在登录类中执行时显示为“ None”。

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')]

希望以前有人尝试过这样做。 如果添加一个问题作为答案是虚假的,我提前表示歉意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM