【问题标题】:concept of session and cookie in web development pythonweb开发python中会话和cookie的概念
【发布时间】:2012-09-30 21:27:21
【问题描述】:

我对 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 中会话代码

我希望它是什么语言,但开发登录屏幕和通过创建一些会话 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'

【问题讨论】:

  • 看看谷歌应用引擎。它包括很多服务,您可以使用谷歌身份验证。我的意思是:Google 将处理您的几乎所有身份验证。它是免费的。 developers.google.com/appengine/docs/python/gettingstarted/…
  • 是的,或者看看更全面的网络框架,比如 Django?它将为您处理会话 + 用于用户身份验证的 cookie,并为您提供一个很好的抽象......
  • 是的,我想先使用 django,但是因为我只需要三个页面,比如登录页面、列表页面、表单页面。所以我选择了 web.py 框架,我被困在会话附近

标签: python session authentication cookies web.py


【解决方案1】:

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

如果您已经需要 web.py 的有效解决方案,那么您可以看看这个模块:http://jpscaletti.com/webpy_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

【讨论】:

  • 所以这里发生的事情是我可以像“session.user = user”一样成功保存用户详细信息,但是当我尝试在另一个类的另一个函数中访问这个“session.user”时正在显示 AttributeError: 'ThreadedDict' 对象没有属性 'user'。如果我在另一个类中获得了这个 session.user 数据,那么游戏就结束了,因为我可以编写 auth_required 函数并防止用户在没有登录的情况下访问页面
  • 也许您的问题可能与使用带有 reloader 的会话会话 webpy.org/cookbook/session_with_reloader
  • 嘿,非常感谢安德烈,我已经得到了你之前回答过的这个链接stackoverflow.com/questions/7382886/…,我已经使用了 unni 给出的代码 if web.config.get('_session' )是无:......通过使用它现在它工作了。再次衷心感谢你。
  • 好的,我很高兴我们终于完成了这个:)
猜你喜欢
  • 1970-01-01
  • 2016-07-10
  • 2015-07-01
  • 2016-01-20
  • 1970-01-01
  • 2012-02-06
  • 2010-12-20
  • 1970-01-01
  • 2011-02-01
相关资源
最近更新 更多