GAE中关键字参数的多个值

2024-04-18 09:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在googleappengine(localhost)上遇到了一个Python错误 我想用Model.get_按_id()函数,但我遇到了一个多关键字参数错误,正如我在下面代码的注释中指出的那样。从底部算起的第三行

我肯定这是个简单的错误,我只是看不出来。在

提前谢谢!在

'''
Created on 09/01/2013

@author: jonathan
'''
import webapp2_extras.security as security
from google.appengine.ext import db
import hashlib
import datetime

class User(db.Model):
    username = db.StringProperty(required=True)
    passhash = db.StringProperty(required=True)
    email = db.EmailProperty()
    created = db.DateTimeProperty(auto_now_add=True)
    authtoken = db.StringProperty(required=True)

    def __init__(self, username, password, email=None):
        authtoken = security.generate_random_string(entropy=256)
        passhash = security.generate_password_hash(password)
        super(User, self).__init__(username=username,
                                   passhash=passhash,
                                   email=email,
                                   authtoken=authtoken)

    def __str__(self):
        return self.username

    def check_password(self, password):
        return security.check_password_hash(password, self.passhash)

    @classmethod
    def check_unique_user(cls, username):
        return not bool(cls.all().filter('username =', username).count())

    def get_session_token(self, dt=None):
        ID = self.key().id()
        if not dt:
            dt = datetime.datetime.now().strftime("%d%m%y%H%M%S")
        hashstring = "{0}${1}${2}".format(ID, dt, self.authtoken)
        return '{0}${1}${2}'.format(ID, dt, hashlib.sha256(hashstring).hexdigest())

    @classmethod
    def check_session_token(cls, session_token):
        if session_token:
            ID, dt = session_token.split("$")[:2]
            if ID.isdigit():
                user = cls.get_by_id(ids=int(ID))  # Raises TypeError: __init__() got multiple values for keyword argument 'username'
                if user and user.check_session_token(session_token, dt):
                    return user

我的其他代码:

在普通.py#这一个还在进行中。。。在

^{pr2}$

在注册.py在

'''
Created on 07/01/2013

@author: jonathan
'''
import common
from webapp2_extras.routes import RedirectRoute
import re
from models.user import User

def getroutes():
    return [RedirectRoute(r'/signup', handler=SignupPage, name='signup', schemes=common.app_scheme, strict_slash=True),
            (RedirectRoute(r'/welcome', handler=WelcomePage, name='welcome', strict_slash=True)),
            (RedirectRoute(r"/login", handler=LoginPage, name="login", schemes=common.app_scheme, strict_slash=True)),
            (RedirectRoute(r'/logout', handler=LogoutPage, name="logout", strict_slash=True))]

username_pattern = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
password_pattern = re.compile(r"^.{3,20}$")
email_pattern = re.compile("^[\S]+@[\S]+\.[\S]+$")
def valid_username(username):
    return username_pattern.match(username)

def valid_password(password):
    return password_pattern.match(password)

def verify_password(password, verify):
    return password == verify

def valid_email(email):
    return email_pattern.match(email)


class SignupPage(common.Handler):
    def render(self, **kwargs):
        super(SignupPage, self).render("signup.html", **kwargs)

    def get(self):
        session_token = self.request.cookies.get("session")
        if User.check_session_token(session_token):
            self.redirect_to("welcome")
        self.render()

    def post(self):
        v_username = v_password = v_email = False
        username = self.request.get("username")
        password = self.request.get("password")
        verify = self.request.get("verify")
        email = self.request.get("email")
        params = {'username_error':'',
                  'password_error':'',
                  'verify_error':'',
                  'email_error':'',
                  'username':username,
                  'email':email}

        if valid_username(username):
            if User.check_unique_user(username):
                v_username = True
            else:
                params['username_error'] = "Username taken"
        else:
            params['username_error'] = "Invalid username"


        if valid_password(password):
            if verify_password(password, verify):
                v_password = True
            else:
                params['verify_error'] = "Passwords do not match"
        else:
            params['password_error'] = "Invalid password"

        if valid_email(email):
            v_email = True
        else:
            params['email_error'] = "Invalid email"

        if v_username and v_password:
            if v_email:
                user = User(username=username,
                            password=password,
                            email=email)
            else:
                user = User(username=username,
                            password=password)
            user.put()
            session_token = user.get_session_token()
            self.response.set_cookie("session", session_token)
            self.redirect(r'/welcome')
        else:
            self.render(**params)


class WelcomePage(common.Handler):
    def get(self):
        session_token = self.request.cookies.get("session")
        user = User.check_session_token(session_token)
        if not user:
            self.response.delete_cookie('session')
            self.redirect_to("signup")
        else:
            self.render("welcome.html", {'user':user})



class LoginPage(common.Handler):
    def get(self):
        session_token = self.request.cookies.get("session")
        user = User.check_session_token(session_token)
        if not user:
            self.response.delete_cookie('session')
            self.redirect_to("signup")
        else:
            self.render("login.html")

    def post(self):
        username = self.request.get('username')
        password = self.request.get('password')
        remember = self.request.get('remember')
        params = {}
        user = None

        if valid_username(username):
            user = User.all().filter('username =', username).get()
            if not user:
                params['username_error'] = "Can't find username"
        else:
            params['username_error'] = "Invalid username"

        if user and user.check_password(password):
            self.redirect_to('welcome')
        else:
            params['password_error'] = "Mismatched password"
            self.render('login.html', params)


class LogoutPage(common.Handler):
    def get(self):
        self.response.delete_cookie("session")
        self.redirect(r'/signup')

Tags: selftokentruegetifemailsessiondef
1条回答
网友
1楼 · 发布于 2024-04-18 09:25:18

您可能在数据存储中有一个User实例,其中“username”不是StringProperty,而是一个列表。当db库获取实体并解析它时,它无法将列表转换为StringProperty。在

我建议使用datastoreviewer并检查您的实体是否有有效的用户名字符串。在

编辑:再看一遍代码。重写init是一个非常糟糕的主意。User类不是典型的类,而是用于生成用户实例的元类。也就是说,用户实例实际上不是用户类的实例。我怀疑你在那里遇到了麻烦。在

相关问题 更多 >