1

小さなWebアプリケーションを設計するためにweb.pyフレームワークを使用しています。現在、ログインページを作成しており、コードは以下のとおりです

index.py

import web
from web import form
from web.contrib.auth import DBAuth
import MySQLdb as mdb

render = web.template.render('templates/')


urls = (
  '/',   'Login',
  '/projects',  'Projects',
  '/logout',   'Logout',
)

app = web.application(urls, globals()) # Creating an instance(object) app which is the mediator between our classes and the web.It will handle browser requests and serve your pages

web.config.debug = False
db = web.database(dbn='mysql', db='Python_Web', user='root', pw='redhat')
settings = {}

if web.config.get('_session') is None:
    session = web.session.Session(app,web.session.DiskStore('sessions'),initializer={'user':'anonymous','loggedin':False})
    web.config._session = session
else:
    session = web.config._session

auth = DBAuth(app, db, session,**settings)


def logged():
    if session['loggedin'] == 1:
        return True
    else:
        return False
class Login:

    # field validators
    username_required = form.Validator("Username not provided", bool)
    password_required = form.Validator("Password not provided", bool)

    # form validators
    login_details_required = form.Validator("Please Enter Login Details", lambda f: f["username"] or f["password"])

    login_form = form.Form( 
        form.Textbox('username', username_required),
        form.Password('password',password_required,description="Password"),
        form.Button('Login'),
        )

    def GET(self):
        if logged():
            raise web.seeother('/projects')
        else:
            form = self.login_form()
            return render.login(form)

    def POST(self):

        if not my_form.validates(dict(username="", password="small")):
            return render.login(form)

        i = web.input()
        username = i.username.strip()
        password = i.password.strip()
        user = auth.authenticate(username, password)
        if not user:
            session.loggedin = False
            return render.login_error(form) 
        else:
            auth.login(user)
            session.loggedin = True
            session.user = i.username.strip()
            raise web.seeother('/projects')

if __name__ == "__main__":
    web.internalerror = web.debugerror
    app.run()  

ここで上記のコードで私の意図は

1.ユーザー名が提供されていない場合は"Username not provided"、ログインをクリックしたときに表示されます

2.パスワードが提供されていない場合は、["password not provided"ログイン] をクリックするとパスワードが表示されます。

3.パスワードが提供されたが、長さが7文字未満の場合"Password length should be minimum 7 characters"、ログインをクリックすると表示されます(もちろん、この検証コンセプトcreating a userはパスワードを選択するときに適しています)

4.両方が提供されていない場合は、["Please Enter Login Details"ログイン]をクリックすると表示されます

5.ログインの詳細が一致しない"Invalid Username or Password"場合は、ログインをクリックすると表示され、ログインの詳細が一致した場合は次のページにリダイレクトされます

上記のコードでは、ログインの詳細が次のページへのリダイレクトに正常に一致し、表示されない場合Invalid username or password(ページ return render.login_error(form)から同じ html コードをコピーし、その中に余分な行を追加しました)login(form)login_error(form)"Invalid Username or Password"

またregex、パスワード検証用の式を作成しましたが、それが機能することを願っています(正確にチェックしたわけではありません)。パスワードの長さが7文字未満の場合、同じログインページにリダイレクトする代わりに次のページにリダイレクトしないため、同時に表示したい"Password length should be minimum 7 characters"私ができないメッセージのようなブラウザで(やり方がわからない)

また、上記のようform.notnull()に作成時にユーザー名を検証として指定Formしました。ログインをクリックしようとすると、フォームが検証されるかどうかがチェックされ、同じログインページにリダイレクトされない場合はメッセージが表示され、"Please enter the username"そうでない場合はパスワードも表示されます提供された

  1. 上記の正規表現が正しく機能するかどうか (私は今まで正規表現に取り組んでいませんでした)

  2. Invalid username or password詳細が正しくない場合にメッセージをブラウザに表示するためだけに別のhtmlページを作成したため、ブラウザでユーザー名、パスワードが提供されていない場合にブラウザに上記の検証メッセージを表示する方法

このすべての検証を単一の html ファイル (のようなlogin.html) 自体で実行できるかどうか? 、私は多くのことを試しましたが、ここで行われているプロセスをキャッチできません。そうであれば、個々のメッセージに対して複数の html を作成する手間を省くことができます

上記の一般的な問題を解決する方法を誰か教えてもらえますか? これは Web アプリケーションの最初のステップであり、以前は Web アプリケーションに取り組んだことがないため、クエリは気にしないでください。

4

1 に答える 1

1

多くのバリデーターを同じ入力フィールドに追加でき、フォーム レベルの検証もあります。

from web import form


# field validators
username_required = form.Validator("Username not provided", bool)
password_required = form.Validator("Password not provided", bool)
password_length = form.Validator("Password length should be minimum 7 characters", lambda p: p is None or len(p) >= 7)

# form validators
login_details_required = form.Validator("Please Enter Login Details", lambda f: f["username"] or f["password"])

def check_login(f):
    # check for login here
    return False
valid_credentials = form.Validator("Invalid username or password", check_login)

login_form = form.Form(
    form.Textbox('username', username_required),
    form.Password('password', password_required, password_length, description="Password"),
    form.Button('Login'),
    validators=[login_details_required, valid_credentials],
)


my_form = login_form()
if not my_form.validates(dict(username="", password="small")):
    print my_form.render_css()

if not my_form.validates(dict(username="notnull", password="just-enough")):
    print my_form.render_css()

login_details_requiredフォーム レベルの検証は、すべてのフィールド バリデーターに合格した場合にのみトリガーされるため、トリガーされないことに注意してください。

于 2012-10-16T22:18:38.647 に答える