@@ -30,33 +30,58 @@ def home(self):
30
30
def hello (self ):
31
31
return {'name' : 'Hello View' }
32
32
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
+
33
53
@view_config (route_name = 'login' , renderer = 'login.pt' )
34
- @forbidden_view_config (renderer = 'login.pt' )
35
54
def login (self ):
36
55
request = self .request
56
+ session = request .session
37
57
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' , '' )
43
60
login = ''
44
61
password = ''
62
+
45
63
if 'form.submitted' in request .params :
46
64
login = request .params ['login' ]
47
65
password = request .params ['password' ]
48
66
hashed_pw = USERS .get (login )
49
67
if hashed_pw and check_password (password , hashed_pw ):
50
68
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
+
53
79
message = 'Failed login'
54
80
55
81
return dict (
56
82
name = 'Login' ,
57
83
message = message ,
58
84
url = request .application_url + '/login' ,
59
- came_from = came_from ,
60
85
login = login ,
61
86
password = password ,
62
87
)
0 commit comments