@@ -30,33 +30,58 @@ def home(self):
3030 def hello (self ):
3131 return {'name' : 'Hello View' }
3232
33+ @forbidden_view_config ()
34+ def forbidden (self ):
35+ request = self .request
36+ session = request .session
37+ if request .matched_route is not None :
38+ session ['came_from' ] = {
39+ 'route_name' : request .matched_route .name ,
40+ 'route_kwargs' : request .matchdict ,
41+ }
42+ if request .authenticated_userid is not None :
43+ session ['message' ] = (
44+ f'User { request .authenticated_userid } is not allowed '
45+ f'to see this resource. Please log in as another user.'
46+ )
47+ else :
48+ if 'came_from' in session :
49+ del session ['came_from' ]
50+
51+ return HTTPFound (request .route_url ('login' ))
52+
3353 @view_config (route_name = 'login' , renderer = 'login.pt' )
34- @forbidden_view_config (renderer = 'login.pt' )
3554 def login (self ):
3655 request = self .request
56+ session = request .session
3757 login_url = request .route_url ('login' )
38- referrer = request .url
39- if referrer == login_url :
40- referrer = '/' # never use login form itself as came_from
41- came_from = request .params .get ('came_from' , referrer )
42- message = ''
58+ came_from = session .get ('came_from' )
59+ message = session .get ('message' , '' )
4360 login = ''
4461 password = ''
62+
4563 if 'form.submitted' in request .params :
4664 login = request .params ['login' ]
4765 password = request .params ['password' ]
4866 hashed_pw = USERS .get (login )
4967 if hashed_pw and check_password (password , hashed_pw ):
5068 headers = remember (request , login )
51- return HTTPFound (location = came_from ,
52- headers = headers )
69+
70+ if came_from is not None :
71+ return_to = request .route_url (
72+ came_from ['route_name' ], ** came_from ['route_kwargs' ],
73+ )
74+ else :
75+ return_to = request .route_url ('home' )
76+
77+ return HTTPFound (location = return_to , headers = headers )
78+
5379 message = 'Failed login'
5480
5581 return dict (
5682 name = 'Login' ,
5783 message = message ,
5884 url = request .application_url + '/login' ,
59- came_from = came_from ,
6085 login = login ,
6186 password = password ,
6287 )
0 commit comments