[英]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.