我对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网站时,我检查会话,但我不知道,我做了什么。
请帮忙!
答案 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')]
希望有人曾试图这样做。如果将问题添加为答案是一种失礼,我会提前道歉。