0
私は登録ページを作成しようとしていました。これには登録が含まれ、その後にウェルカムページが表示されます。また、ログインページとログアウトページもあります。Python属性エラー:Cookie
これは私のコードです:
import os
import re
import hashlib
import hmac
import random
import webapp2
import jinja2
from google.appengine.ext import db
from string import letters
template_dir= os.path.join(os.path.dirname(__file__), 'templates')
jinja_env= jinja2.Environment(loader= jinja2.FileSystemLoader(template_dir),
autoescape= True)
secret="wj1982yexdhdq,@(*S9ew8nqDX"
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
#hash the string s
def hash_str(s):
return hmac.new(secret,s).hexdigest()
#returns the string and the hash of the string
def make_secure_val(s):
return "%s|%s" % (s,hash_str(s))
#checks whether the given string and hash along with it is valid
def check_secure_val(h):
val = h.split('|')[0]
if h == make_secure_val(val):
return val
class Handler(webapp2.RequestHandler):
def write(self,*a,**kw):
self.response.out.write(*a,**kw)
def render_str(self,template,**params):
#Causes Jinja to load that file creating jinja template
# t=jinja_env.get_template(template)
# return t.render(params)
params['user'] = self.user
return render_str(template, **params)
def render(self,template,**kw):
self.write(self.render_str(template,**kw))
#sets a secure cookie for a given name by hashing it
def set_secure_cookie(self,name,val):
cookie_val= make_secure_val(val)
self.response.headers.add_header('Set-Cookie','%s=%s; Path=/' %(name,cookie_val))
#checks if the cookie is valid by checking it with it's hashed value
def read_cookie_val(self,name):
cookie_val= self.request.cookies.get(name)
return cookie_val and check_secure_val(cookie_val)
def login(self,user):
self.set_secure_cookie('user-id',str(user.key().id()))
def logout(self):
self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')
def initialize(self, *a, **kw):
webapp2.RequestHandler.initialize(self, *a, **kw)
uid = self.read_cookie_val('user-id')
self.User = uid and User.by_id(int(uid))
class User(db.Model):
name= db.StringProperty(required=True)
password_hash= db.StringProperty(required=True)
email= db.StringProperty()
@classmethod
def by_id(cls, uid):
return User.get_by_id(uid, parent= users_key())
@classmethod
def by_name(cls, name):
u= db.GqlQuery("SELECT * from User WHERE cls.name = '%s';" %(name)).get()
return u
@classmethod
def register(cls, name, pw, email=None):
pw_hash= make_pw_hash(name, pw)
return User(parent= users_key(), name= name, password_hash=pw_hash, email= email)
@classmethod
def login(cls, name, pw):
u = cls.by_name(name)
if u and valid_pw(name, pw, u.password_hash):
return u
class Signup(Handler):
def get(self):
self.render("loginpage.html")
def post(self):
have_error= False
self.user_name= self.request.get("username")
self.user_password= self.request.get("password")
self.verify= self.request.get("verify")
self.user_email= self.request.get("email")
params= dict(username= self.user_name, email= self.user_email)
#check if username is valid or not
if not valid_username(self.user_name):
params['err_user']= "Incorrect UserName!"
have_error=True
#check if password is valid or not
if not valid_password(self.user_password):
params['err_pass']= "Incorrect Password!"
have_error=True
elif(self.user_password!= self.verify):
params['err_match']= "The passwords don't match!"
have_error=True
#check if email is valid or not
if not valid_email(self.user_email):
params['err_email']= "Incorrect Email!"
have_error= True
if have_error==True:
self.render("loginpage.html",**params)
else:
self.done()
def done(self,*a,**kw):
raise NotImplementedError
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(user_name):
return user_name and USER_RE.match(user_name)
PASS_RE= re.compile(r"^.{3,20}$")
def valid_password(user_password):
return user_password and PASS_RE.match(user_password)
EMAIL_RE= re.compile(r"^[\S][email protected][\S]+\.[\S]+$")
def valid_email(user_email):
return not user_email or EMAIL_RE.match(user_email)
def make_salt(length=5):
return ''.join(random.choice(letters) for x in xrange(length))
def make_pw_hash(name,pw,salt=None):
if not salt:
salt= make_salt()
h= hashlib.sha256(name + pw + salt).hexdigest()
return '%s,%s' %(salt,h)
def valid_pw(name,password,h):
salt= h.split(',')[0]
return h == make_pw_hash(name,password,salt)
def users_key(group = 'default'):
return db.Key.from_path('users', group)
class Register(Signup):
def done(self):
u= User.by_name(self.user_name)
if u:
msg= "User Name already exists"
self.render("loginpage.html",err_user=msg)
else:
u=User.register(self.user_name,self.user_password,self.user_email)
u.put()
self.login(u)
self.redirect('/welcome')
class Login(Handler):
def get(self):
self.render("login-page.html")
def post(self):
username= self.request.get("username")
password= self.request.get("password")
u= User.login(username,password)
if u:
self.login(u)
self.redirect('/welcome')
else:
error= "Invalid Username or Password"
self.render("login-page.html", error=error)
class Logout(Handler):
def get(self):
self.logout()
self.redirect('/signup')
#page to be displayed on successfully logging in
class Welcome(Handler):
def get(self):
if self.user:
self.render("welcome.html",username= self.user.name)
else:
self.redirect('/signup')
app = webapp2.WSGIApplication([
('/signup', Register),
('/welcome',Welcome),
('/login',Login),
('/logout',Logout)
], debug=True)
しかし、このプログラムを実行する上で、私は次のエラーを取得しています:
raise AttributeError(attr) AttributeError: Cookie
誰かが、このコードで私を助けてくださいことはできますか?
ありがとう@snakecharmerbを参照してください
でなければなりません。私はちょっと混乱しました。しかし、私のプログラムはまだ動かない。そして今、私はエラーを取得しています:AttributeError: 'Welcome'オブジェクトに属性 'user'がありません。 –
あなたがそれを解決できない場合(ヒントリクエストハンドラにユーザ属性がない場合は、どこかからユーザを取得する必要があります)、次に新しい質問をします。見つけた新しいエラーを処理するために質問を修正しないでください。 – snakecharmerb
そうですか。そのために残念。 –