2017-11-20 14 views
0

저는 학교에서 졸업을위한 게시물 등을 만들기위한 웹 플랫폼을 구축하고 있습니다. 나는이 파이썬 코드를 작성해 왔으며 무엇을해야할지 확신이 없습니다. 여러 세션을 관리하기 위해 비커를 사용해 보았습니다.이 코드는 StuFish's code에 기반을두고 있으며 코드로 코드를 합성하는 방법을 잘 모르는 것 같습니다. 홈페이지 렌더링과 관련하여 문제가 발생합니다.AttributeError : 'NoneType', 비커를 사용하여 웹 세션을 여러 번 수행했습니다.

import web 
    import datetime 
    from beaker.middleware import SessionMiddleware 
    from Models import RegisterModel, LoginModel, Posts 

    web.config.debug = False 

    urls = (
      '/', 'Home', 
      '/adminhome', 'AdminHome', 
      '/modhome', 'ModHome', 
      '/register', 'Register', 
      '/postreg', 'PostRegistration', 
      '/login', 'Login', 
      '/check-login', "CheckLogin", 
      '/logout', 'Logout', 
      '/post-activity', 'PostActivity', 
      '/profile', 'Profile', 
      '/settings', 'Settings', 
      '/update-user', 'UpdateSettings', 
      '/admin', 'Admin' 
      ) 

    t_globals = { 
       'datestr': web.datestr, 
       'str': str, 
       'datetime': datetime 
       } 

    app = web.application(urls, globals()) 

    session = web.session.Session(app, web.session.DiskStore("sessions"),initializer={"user":None}) 
    session_data = session._initializer 

    render = web.template.render("Views/Templates", base="MainLayout", globals={"session":session_data, "current_user": session_data["user"]}) 

    # beaker options are optional.... but it's good to see 
    # where they are called 

    session_opts = { 
     'session.cookie_expires': True, 
     'session.timeout' : 600, 
     'session.secure' : True, 
    } 

    # define webPy app 

    # smash it all together and define name for cookie key (sid) 
    def session_mw(app): 
     return SessionMiddleware(app, config = session_opts, key = "sid") 



    # function to check if we are logged in 
    def logged(session): 
     if 'Login' in session: 
      if session['Login']==1: 
       return True 
      else: 
       return False 
     else: 
      return False 

    # create different renders based on log in privilege 
    def create_render(privilege): 
     session = web.ctx.environ['beaker.session'] 
     if logged(session) == True: 
      if privilege == 0: 
       print("OH BABY") 
       render = web.template.render('/Views/Templates/user/', base='/Views/Templates/MainLayout', globals=t_globals) 
      elif privilege == 1: 
       print("LET ME LOVE YOU") 
       render = web.template.render('/Views/Templates/user/', base='/Views/Templates/MainLayout', globals=t_globals) 
      elif privilege == 2: 
       print("DONT HURT ME")   
       render = web.template.render('/Views/Templates/admin/', base='/Views/Templates/MainLayout', globals=t_globals) 
      else: 
       print("NOOT NOOT")   
       render = web.template.render('/Views/Templates/viewer', base='/Views/Templates/MainLayout', globals=t_globals) 

      render = web.template.render('/Views/Templates/', base='MainLayout', globals=t_globals) 
      return render 

    class Login: 
     def GET(self): 
      session = web.ctx.environ['beaker.session'] 
      if logged(session) == True: 
       print("SOMEBODY ONCE TOLD ME THAT THE WORLD WAS GONNA ROLL ME BUT I AINT THE SHARPEST TOOL IN THE SHED") 
       render = create_render(session['privilege']) 
       return render.Home() 
      else: 
       render = create_render(0) 
       print("BLAH BLAH BLAH BLAH") 
       return render.Home() 

    # I get user credentials from a database (called in model.get_users) 
     def POST(self): 
      session = web.ctx.environ['beaker.session'] 
      data= web.input() 
      name = data['user'] 
      password = data['password'] 
      ident = model.get_users(m, name) 
      try: 
       if password == ident.password.strip(): 
        session['Login'] = 1 
        session['privilege'] = ident['privilege'] 
        session['user'] = name 
        session.save() 
        render = create_render(session['privilege']) 
        print("HERE") 
        return render.Home() 

       else: 
        session.login = 0 
        session.privilege = 0 
        session.user = 'none' 
        render = create_render(session['privilege']) 
        print("NO HERE YO") 
        return render.Login() 
      except: 
       session['Login'] = 0 
       session['privilege'] = 0 
       render = create_render(session['privilege']) 
       print("BANANA") 
       return render.Login() 

    # Credits go to bbangert for the middleware code 
    class Logout: 
     def GET(self): 
      session = web.ctx.environ['beaker.session']  
      try: 
       render = create_render(0) 
       session.invalidate() 
       session.delete() 
       print("TOPSY TURVY") 
       return render.Login() 
      except: 
       session.invalidate() 
       session.delete() 
       render = create_render(0) 
       print("MESSY RIGHT") 
       return render.Login() 

    class Home: 
     def GET(self): 
      session = web.ctx.environ['beaker.session'] 
      if logged(session) == False: 
       raise web.seeother('/login') 
      else: 
       render = create_render(0) 
       return render.Home() 

    ''' 
      data = type('obj', (object,), {'username':'q', 'password':'q'}) 
      login = LoginModel.LoginModel() 
      isValid = login.check_user(data) 
      if isValid: 
       session_data['user'] = isValid 

      post_model = Posts.Posts() 
      posts = post_model.get_all_posts() 

      return render.Home(posts) 
    ''' 

    class Register: 
     def GET(self): 
      return render.Register() 

    class PostRegistration: 
     def POST(self): 
      print("DOING POST PROCESSING") 
      data = web.input() 
      reg_model = RegisterModel.RegisterModel() 
      reg_model.insert_user(data) 
      return data.username 

    class CheckLogin: 
     def POST(self): 
      print("DOING CHECK LOGIN") 
      data = web.input() 
      login = LoginModel.LoginModel() 
      isValid = login.check_user(data) 
      if isValid: 
      session_data["user"] = isValid 
      return isValid 
      return "error" 

    class PostActivity: 
     def POST(self): 
      print("DOING POST ACTIVITY") 
      data = web.input() 
      data.username = session_data['user']['username'] 
      post_model = Posts.Posts() 
      post_model.insert_post(data)  
      return "success" 

    class Profile: 
     def GET(self): 
      return render.Profile() 

    class Settings: 
     def GET(self): 
      return render.Settings() 

    class UpdateSettings: 
     def POST(self): 
      data = web.input() 
      data.username = session_data['user']['username'] 
      update = RegisterModel.RegisterModel() 
      update.update_settings(data) 
      return "success" 

    class Admin: 
     def GET(self): 
     return render.Admin() 

    class AdminHome: 
     def GET(self): 
     return AdminHome() 

    class ModHome: 
     def GET(self): 
     return ModHome() 

    if __name__ == "__main__": 
     app.run(session_mw) 

내가 정의 렌더링 여러 번하지만 그 문제가 될 이유를 내가 이해하지 못하는 this code와 같은 사건이었다 것으로 이해 :
여기에 우리가 가지고있는 코드입니다. 누군가가 나에게 솔루션을 제공하거나 날이 오류를 해결하는 데 도움이 될 수있는 경우

http://0.0.0.0:8080/ 
    BLAH BLAH BLAH BLAH 
    Traceback (most recent call last): 
     File "/usr/local/lib/python3.4/dist-packages/web/application.py", line 257, in process 
     return self.handle() 
     File "/usr/local/lib/python3.4/dist-packages/web/application.py", line 248, in handle 
     return self._delegate(fn, self.fvars, args) 
     File "/usr/local/lib/python3.4/dist-packages/web/application.py", line 488, in _delegate 
     return handle_class(cls) 
     File "/usr/local/lib/python3.4/dist-packages/web/application.py", line 466, in handle_class 
     return tocall(*args) 
     File "app.py", line 94, in GET 
     return render.Home() 
    AttributeError: 'NoneType' object has no attribute 'Home' 

, 그 것이다 크게

(!) 참고를 감사 : 여기

우리 나타나는 오류 메시지입니다 내가 this guy과 관련된하고 단지 코드가 비슷하다고 생각한 경우

답변

0

create_render(privilege)으로 전화 할 때 logged(session)이 거짓 인 경우 create_render(privilege)None을 반환합니다. 따라서 render = create_render(0)이 오류가 발생하기 전에 두 줄을 실행하면 render을 없음으로 설정합니다. 그런 다음 render이 None 일 때 Home 페이지를 렌더링하려고 시도하면 예외가 발생합니다.

create_render(privilege)에서 logged(session)이 거짓 인 경우를 고려해야합니다.

+0

로깅되면 (세션) 기본 위치가 틀림없이 렌더링되도록 이제 코드를 재정렬했습니다. 이제 AttributeError : No라는 템플리트가 생겼습니다. – HolyWater

+0

그러면'web.template.render (directory)'를 호출 할 때 지정한 디렉토리에 "Home"파일이 없습니다. – busterroni