会话和cookie在web开发python中的概念

时间:2012-10-10 12:01:50

标签: python session authentication cookies web.py

我是Web开发的新手,我正在开发web.py框架来开发一个小型Web应用程序。假设登录屏幕为localhost:9090/login,在成功登录后,它将重定向到下一页localhost:9090/details,点击另一个按钮add后再次重定向到localhost:9090/details/details_entry

但是当我在浏览器上直接尝试localhost:9090/details时,它可以在没有登录的情况下查看页面。所以经过谷歌搜索后我才知道我需要使用session concept,但我现在已经厌倦了在谷歌搜索网页概念的繁忙日程。

可以让任何人知道

的概念
  1. session(实际上为什么创建它以及如何在python中登录页面后使用它)

  2. 实际上是user authentication的完整概念, 创建用户登录页面需要遵循的步骤是什么 用户登录后需要遵循的步骤和详细信息 当用户注销以及如何在python

  3. 中使用会话代码时会发生什么

    我希望它的语言是什么,但是通过创建一些会话ID来开发登录屏幕和重定向到下一个URL的概念是相同的,因此用户身份验证概念非常重要,可能这个问题对其他人有用。

    已编辑的代码

    --------------

    Login.py

    import os
    import sys
    import web
    from web import form
    
    
    
    render = web.template.render('templates/')
    
    
    urls = (
      '/',   'Login',
      '/projects',  'Projects',
      '/project_details',  'Project_Details',  
    )
    
    app = web.application(urls, globals())
    
    
    web.config.debug = False
    db = web.database(dbn='mysql', db='Python_Web', user='root', pw='redhat')
    settings = {}
    store = web.session.DBStore(db, 'sessions')
    session = web.session.Session(app, store, initializer={'user': None})
    
    class Login:
    
        login_form = form.Form( 
            form.Textbox('username', form.notnull),
            form.Password('password', form.notnull),
            form.Button('Login'),
            )
    
        def GET(self):
            form = self.login_form()
            return render.login(form)
    
    def POST(self):
        if not self.login_form.validates():
            return render.login(self.login_form)
        i = web.input()
        username = i.username
        password = i.password
        user = db.select('user',
            where = 'user_login = $username', 
            vars = {'username': username}
        if username == user['username'] and password == user['password']:
            session.user = username
            raise web.seeother('/projects')
    
        else:
            return render.login_error(form)    
    
    def auth_required(func):
        def proxyfunc(self, *args, **kw):
            print session.user,"=======> Session stored"
            try:
                if session.user:
                  return func(self, *args, **kw)
            except:
                pass
            raise web.seeother("/")
        return proxyfunc
    
    class Projects:
    
        project_list = form.Form( 
            form.Button('Add Project'),
            )
    
        @auth_required
        def GET(self):
            project_form = self.project_list()
            return render.projects(project_form)  
    
       def POST(self):
            raise web.seeother('/project_details')
    
    if __name__ == "__main__":
        web.internalerror = web.debugerror
        app.run()  
    

    在成功登录后的上述代码中,页面将重定向到下一页。在这里,我需要实现会话概念,但我仍然坚持在上面的代码中实现会话代码的位置。任何人都可以指出我在上面的py代码中为登录页面编写会话代码的正确方法。在此工作之后需要在同一个py文件中实现注销功能

    在实施auth_required函数后编辑代码并得到以下错误

    结果:

    Traceback (most recent call last):
      File "/usr/lib/python2.7/site-packages/web/application.py", line 239, in process
        return self.handle()
      File "/usr/lib/python2.7/site-packages/web/application.py", line 230, in handle
        return self._delegate(fn, self.fvars, args)
      File "/usr/lib/python2.7/site-packages/web/application.py", line 420, in _delegate
        return handle_class(cls)
      File "/usr/lib/python2.7/site-packages/web/application.py", line 396, in handle_class
        return tocall(*args)
      File "/home/local/user/python_webcode/index.py", line 102, in proxyfunc
        print session.user,"=======> Session Stored"
      File "/usr/lib/python2.7/site-packages/web/session.py", line 71, in __getattr__
        return getattr(self._data, name)
    AttributeError: 'ThreadedDict' object has no attribute 'user'
    

1 个答案:

答案 0 :(得分:0)

web.py提供了session抽象和几个会话存储。你需要做的是写入登录控制器,在GET上显示表单,找到用户并在POST上执行密码检查,然后将用户存储在会话中并在注销时终止会话。在它之后,您可以编写装饰器来检查会话中是否存在用户以通过控制器方法使用它。无论如何,用户身份验证概念在所有Web应用程序中大致相同。

如果您需要为web.py提供解决方案,那么您可以查看此模块:http://jpscaletti.com/webpy_auth/

如果您决定自己登录,最简单的auth装饰器可能如下所示:

def auth_required(func):
    def proxyfunc(self, *args, **kw):
        try:
            if session.user:
              # user is logged in
              return func(self, *args, **kw)
        except:
            pass
        # user is not logged in
        raise web.seeother("/login")
    return proxyfunc

然后你可以在控制器中的GET和POST方法之前使用@auth_required:

class Projects:
    @auth_required
    def GET(self):
        pass