1

私は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'
4

1 に答える 1

0

web.py は、セッションの抽象化といくつかのセッション ストアを提供します。あなたがしなければならないことは、ログインコントローラーを書き、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
于 2012-10-10T14:12:33.827 に答える