2017-06-26 22 views
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

誰かが、このコードで私を助けてくださいことはできますか?

答えて

0
def read_cookie_val(self,name): 
    cookie_val= self.request.Cookie.get(name) 

docs

Cookies can be accessed in request.cookies. It is a simple dictionary

+0

ありがとう@snakecharmerbを参照してください

def read_cookie_val(self,name): cookie_val= self.request.cookies.get(name) 

でなければなりません。私はちょっと混乱しました。しかし、私のプログラムはまだ動かない。そして今、私はエラーを取得しています:AttributeError: 'Welcome'オブジェクトに属性 'user'がありません。 –

+0

あなたがそれを解決できない場合(ヒントリクエストハンドラにユーザ属性がない場合は、どこかからユーザを取得する必要があります)、次に新しい質問をします。見つけた新しいエラーを処理するために質問を修正しないでください。 – snakecharmerb

+0

そうですか。そのために残念。 –

関連する問題