Список дел Web.py с логином - PullRequest
       20

Список дел Web.py с логином

1 голос
/ 03 февраля 2012

Я пытаюсь добавить функциональность входа в систему для примера web.py .

Это мой код:

""" Basic todo list using webpy 0.3 """
import web
import model

### Url mappings

urls = (
    '/', 'Index',
    '/login', 'Login',
    '/logout', 'Logout',
    '/del/(\d+)', 'Delete',
)


### Templates
render = web.template.render('templates', base='base')
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore('sessions'))

allowed = (
    ('user','pass'),
    ('tom','pass2')
)

class Login:

    login_form = web.form.Form( web.form.Textbox('username'),
        web.form.Password('password'),
        web.form.Button('Login'),
        )

    def GET(self):
        f = self.login_form()
        return render.login(f)

    def POST(self):
        # Validation
        if not self.login_form.validates():
            print "it didn't validate!"

        session.logged_in = True
        raise web.seeother('/')


class Logout:
    def GET(self):
        session.logged_in = False
        raise web.seeother('/')

class Index:

    form = web.form.Form(
        web.form.Textbox('title', web.form.notnull, 
            description="I need to:"),
        web.form.Button('Add todo'),
    )

    def GET(self):
        print "logged_in " + str(session.get('logged_in', False))
        if session.get('logged_in', False):
            """ Show page """
            todos = model.get_todos()
            form = self.form()
            return render.index(todos, form)
        else:
            raise web.seeother('/login')

    def POST(self):
        """ Add new entry """
        form = self.form()
        if not form.validates():
            todos = model.get_todos()
            return render.index(todos, form)
        model.new_todo(form.d.title)
        raise web.seeother('/')



class Delete:

    def POST(self, id):
        """ Delete based on ID """
        id = int(id)
        model.del_todo(id)
        raise web.seeother('/')


app = web.application(urls, globals())

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

Когда пользователь делает POST в /login, logged_in всегда равен False.

Есть идеи, почему?

1 Ответ

1 голос
/ 04 февраля 2012

Я только что исправил это.Мне не хватало некоторого кода инициализации сеанса.Вот рабочий код:

""" Basic todo list using webpy 0.3 """
import web
import model

### Url mappings

urls = (
    '/', 'Index',
    '/login', 'Login',
    '/logout', 'Logout',
    '/del/(\d+)', 'Delete',
)


web.config.debug = False
render = web.template.render('templates', base='base')
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore('sessions'))

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

class Login:

    login_form = web.form.Form( web.form.Textbox('username', web.form.notnull),
        web.form.Password('password', web.form.notnull),
        web.form.Button('Login'),
        )

    def GET(self):
        f = self.login_form()
        return render.login(f)

    def POST(self):
        if not self.login_form.validates():
            return render.login(self.login_form)

        username = self.login_form['username'].value
        password = self.login_form['password'].value
        if (username,password) in allowed:
            session.logged_in = True
            raise web.seeother('/')

        return render.login(self.login_form)


class Logout:
    def GET(self):
        session.logged_in = False
        raise web.seeother('/')

class Index:

    form = web.form.Form(
        web.form.Textbox('title', web.form.notnull, 
            description="I need to:"),
        web.form.Button('Add todo'),
    )

    def GET(self):
        if session.get('logged_in', False):
            """ Show page """
            todos = model.get_todos()
            form = self.form()
            return render.index(todos, form)
        else:
            raise web.seeother('/login')

    def POST(self):
        """ Add new entry """
        form = self.form()
        if not form.validates():
            todos = model.get_todos()
            return render.index(todos, form)
        model.new_todo(form.d.title)
        raise web.seeother('/')



class Delete:

    def POST(self, id):
        """ Delete based on ID """
        id = int(id)
        model.del_todo(id)
        raise web.seeother('/')


app = web.application(urls, globals())

if web.config.get('_session') is None:
    session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0})
    web.config._session = session
else:
    session = web.config._session

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