29
29
from django .db import connection
30
30
from django .http import HttpRequest , HttpResponse
31
31
from django .middleware .csrf import CsrfViewMiddleware , get_token
32
- from django .test import Client , TestCase , override_settings
32
+ from django .test import Client , TestCase , ignore_warnings , override_settings
33
33
from django .test .client import RedirectCycleError
34
34
from django .urls import NoReverseMatch , reverse , reverse_lazy
35
+ from django .utils .deprecation import RemovedInDjango50Warning
35
36
from django .utils .http import urlsafe_base64_encode
36
37
37
38
from .client import PasswordResetConfirmClient
@@ -538,7 +539,7 @@ def fail_login(self):
538
539
)
539
540
540
541
def logout (self ):
541
- self .client .get ("/logout/" )
542
+ self .client .post ("/logout/" )
542
543
543
544
def test_password_change_fails_with_invalid_old_password (self ):
544
545
self .login ()
@@ -979,7 +980,10 @@ def confirm_logged_out(self):
979
980
def test_default_logout_then_login (self ):
980
981
self .login ()
981
982
req = HttpRequest ()
982
- req .method = "GET"
983
+ req .method = "POST"
984
+ csrf_token = get_token (req )
985
+ req .COOKIES [settings .CSRF_COOKIE_NAME ] = csrf_token
986
+ req .POST = {"csrfmiddlewaretoken" : csrf_token }
983
987
req .session = self .client .session
984
988
response = logout_then_login (req )
985
989
self .confirm_logged_out ()
@@ -988,12 +992,28 @@ def test_default_logout_then_login(self):
988
992
def test_logout_then_login_with_custom_login (self ):
989
993
self .login ()
990
994
req = HttpRequest ()
991
- req .method = "GET"
995
+ req .method = "POST"
996
+ csrf_token = get_token (req )
997
+ req .COOKIES [settings .CSRF_COOKIE_NAME ] = csrf_token
998
+ req .POST = {"csrfmiddlewaretoken" : csrf_token }
992
999
req .session = self .client .session
993
1000
response = logout_then_login (req , login_url = "/custom/" )
994
1001
self .confirm_logged_out ()
995
1002
self .assertRedirects (response , "/custom/" , fetch_redirect_response = False )
996
1003
1004
+ @ignore_warnings (category = RemovedInDjango50Warning )
1005
+ @override_settings (LOGIN_URL = "/login/" )
1006
+ def test_default_logout_then_login_get (self ):
1007
+ self .login ()
1008
+ req = HttpRequest ()
1009
+ req .method = "GET"
1010
+ req .session = self .client .session
1011
+ response = logout_then_login (req )
1012
+ # RemovedInDjango50Warning: When the deprecation ends, replace with
1013
+ # self.assertEqual(response.status_code, 405)
1014
+ self .confirm_logged_out ()
1015
+ self .assertRedirects (response , "/login/" , fetch_redirect_response = False )
1016
+
997
1017
998
1018
class LoginRedirectAuthenticatedUser (AuthViewsTestCase ):
999
1019
dont_redirect_url = "/login/redirect_authenticated_user_default/"
@@ -1136,7 +1156,7 @@ def confirm_logged_out(self):
1136
1156
def test_logout_default (self ):
1137
1157
"Logout without next_page option renders the default template"
1138
1158
self .login ()
1139
- response = self .client .get ("/logout/" )
1159
+ response = self .client .post ("/logout/" )
1140
1160
self .assertContains (response , "Logged out" )
1141
1161
self .confirm_logged_out ()
1142
1162
@@ -1146,80 +1166,91 @@ def test_logout_with_post(self):
1146
1166
self .assertContains (response , "Logged out" )
1147
1167
self .confirm_logged_out ()
1148
1168
1169
+ def test_logout_with_get_raises_deprecation_warning (self ):
1170
+ self .login ()
1171
+ msg = (
1172
+ "Log out via GET requests is deprecated and will be removed in Django 5.0. "
1173
+ "Use POST requests for logging out."
1174
+ )
1175
+ with self .assertWarnsMessage (RemovedInDjango50Warning , msg ):
1176
+ response = self .client .get ("/logout/" )
1177
+ self .assertContains (response , "Logged out" )
1178
+ self .confirm_logged_out ()
1179
+
1149
1180
def test_14377 (self ):
1150
1181
# Bug 14377
1151
1182
self .login ()
1152
- response = self .client .get ("/logout/" )
1183
+ response = self .client .post ("/logout/" )
1153
1184
self .assertIn ("site" , response .context )
1154
1185
1155
1186
def test_logout_doesnt_cache (self ):
1156
1187
"""
1157
1188
The logout() view should send "no-cache" headers for reasons described
1158
1189
in #25490.
1159
1190
"""
1160
- response = self .client .get ("/logout/" )
1191
+ response = self .client .post ("/logout/" )
1161
1192
self .assertIn ("no-store" , response .headers ["Cache-Control" ])
1162
1193
1163
1194
def test_logout_with_overridden_redirect_url (self ):
1164
1195
# Bug 11223
1165
1196
self .login ()
1166
- response = self .client .get ("/logout/next_page/" )
1197
+ response = self .client .post ("/logout/next_page/" )
1167
1198
self .assertRedirects (response , "/somewhere/" , fetch_redirect_response = False )
1168
1199
1169
- response = self .client .get ("/logout/next_page/?next=/login/" )
1200
+ response = self .client .post ("/logout/next_page/?next=/login/" )
1170
1201
self .assertRedirects (response , "/login/" , fetch_redirect_response = False )
1171
1202
1172
1203
self .confirm_logged_out ()
1173
1204
1174
1205
def test_logout_with_next_page_specified (self ):
1175
1206
"Logout with next_page option given redirects to specified resource"
1176
1207
self .login ()
1177
- response = self .client .get ("/logout/next_page/" )
1208
+ response = self .client .post ("/logout/next_page/" )
1178
1209
self .assertRedirects (response , "/somewhere/" , fetch_redirect_response = False )
1179
1210
self .confirm_logged_out ()
1180
1211
1181
1212
def test_logout_with_redirect_argument (self ):
1182
1213
"Logout with query string redirects to specified resource"
1183
1214
self .login ()
1184
- response = self .client .get ("/logout/?next=/login/" )
1215
+ response = self .client .post ("/logout/?next=/login/" )
1185
1216
self .assertRedirects (response , "/login/" , fetch_redirect_response = False )
1186
1217
self .confirm_logged_out ()
1187
1218
1188
1219
def test_logout_with_custom_redirect_argument (self ):
1189
1220
"Logout with custom query string redirects to specified resource"
1190
1221
self .login ()
1191
- response = self .client .get ("/logout/custom_query/?follow=/somewhere/" )
1222
+ response = self .client .post ("/logout/custom_query/?follow=/somewhere/" )
1192
1223
self .assertRedirects (response , "/somewhere/" , fetch_redirect_response = False )
1193
1224
self .confirm_logged_out ()
1194
1225
1195
1226
def test_logout_with_named_redirect (self ):
1196
1227
"Logout resolves names or URLs passed as next_page."
1197
1228
self .login ()
1198
- response = self .client .get ("/logout/next_page/named/" )
1229
+ response = self .client .post ("/logout/next_page/named/" )
1199
1230
self .assertRedirects (
1200
1231
response , "/password_reset/" , fetch_redirect_response = False
1201
1232
)
1202
1233
self .confirm_logged_out ()
1203
1234
1204
1235
def test_success_url_allowed_hosts_same_host (self ):
1205
1236
self .login ()
1206
- response = self .client .get ("/logout/allowed_hosts/?next=https://testserver/" )
1237
+ response = self .client .post ("/logout/allowed_hosts/?next=https://testserver/" )
1207
1238
self .assertRedirects (
1208
1239
response , "https://testserver/" , fetch_redirect_response = False
1209
1240
)
1210
1241
self .confirm_logged_out ()
1211
1242
1212
1243
def test_success_url_allowed_hosts_safe_host (self ):
1213
1244
self .login ()
1214
- response = self .client .get ("/logout/allowed_hosts/?next=https://otherserver/" )
1245
+ response = self .client .post ("/logout/allowed_hosts/?next=https://otherserver/" )
1215
1246
self .assertRedirects (
1216
1247
response , "https://otherserver/" , fetch_redirect_response = False
1217
1248
)
1218
1249
self .confirm_logged_out ()
1219
1250
1220
1251
def test_success_url_allowed_hosts_unsafe_host (self ):
1221
1252
self .login ()
1222
- response = self .client .get ("/logout/allowed_hosts/?next=https://evil/" )
1253
+ response = self .client .post ("/logout/allowed_hosts/?next=https://evil/" )
1223
1254
self .assertRedirects (
1224
1255
response , "/logout/allowed_hosts/" , fetch_redirect_response = False
1225
1256
)
@@ -1246,7 +1277,7 @@ def test_security_check(self):
1246
1277
"bad_url" : quote (bad_url ),
1247
1278
}
1248
1279
self .login ()
1249
- response = self .client .get (nasty_url )
1280
+ response = self .client .post (nasty_url )
1250
1281
self .assertEqual (response .status_code , 302 )
1251
1282
self .assertNotIn (
1252
1283
bad_url , response .url , "%s should be blocked" % bad_url
@@ -1272,7 +1303,7 @@ def test_security_check(self):
1272
1303
"good_url" : quote (good_url ),
1273
1304
}
1274
1305
self .login ()
1275
- response = self .client .get (safe_url )
1306
+ response = self .client .post (safe_url )
1276
1307
self .assertEqual (response .status_code , 302 )
1277
1308
self .assertIn (good_url , response .url , "%s should be allowed" % good_url )
1278
1309
self .confirm_logged_out ()
@@ -1286,7 +1317,7 @@ def test_security_check_https(self):
1286
1317
"next_url" : quote (non_https_next_url ),
1287
1318
}
1288
1319
self .login ()
1289
- response = self .client .get (url , secure = True )
1320
+ response = self .client .post (url , secure = True )
1290
1321
self .assertRedirects (response , logout_url , fetch_redirect_response = False )
1291
1322
self .confirm_logged_out ()
1292
1323
@@ -1295,19 +1326,19 @@ def test_logout_preserve_language(self):
1295
1326
self .login ()
1296
1327
self .client .post ("/setlang/" , {"language" : "pl" })
1297
1328
self .assertEqual (self .client .cookies [settings .LANGUAGE_COOKIE_NAME ].value , "pl" )
1298
- self .client .get ("/logout/" )
1329
+ self .client .post ("/logout/" )
1299
1330
self .assertEqual (self .client .cookies [settings .LANGUAGE_COOKIE_NAME ].value , "pl" )
1300
1331
1301
1332
@override_settings (LOGOUT_REDIRECT_URL = "/custom/" )
1302
1333
def test_logout_redirect_url_setting (self ):
1303
1334
self .login ()
1304
- response = self .client .get ("/logout/" )
1335
+ response = self .client .post ("/logout/" )
1305
1336
self .assertRedirects (response , "/custom/" , fetch_redirect_response = False )
1306
1337
1307
1338
@override_settings (LOGOUT_REDIRECT_URL = "logout" )
1308
1339
def test_logout_redirect_url_named_setting (self ):
1309
1340
self .login ()
1310
- response = self .client .get ("/logout/" )
1341
+ response = self .client .post ("/logout/" )
1311
1342
self .assertRedirects (response , "/logout/" , fetch_redirect_response = False )
1312
1343
1313
1344
0 commit comments