Привет! Я читал это представление Django, которое не рендерится после перенаправления Ajax , и имеет код, приведенный ниже, который предназначен для перенаправления на /main
при успешной аутентификации или предупреждения, если иное.
otplogin.html
<!DOCTYPE html>
<html>
<head>
{% load static %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<link href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
<script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>
</head>
<body>
<div id="otplogin">
<form class="form-horizontal" id="getotp" >
{% csrf_token %}
<div class="control-group">
<label class="control-label" for="username">Username</label>
<div class="controls">
<input type="text" id="username" name="username" placeholder="Username">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" value='auth' class="btn">Auth</button>
</div>
</div>
<div class="control-group">
<label class="control-label" for="otp">OTP</label>
<div class="controls">
<input type="otp" name="otp" id="otp" placeholder="OTP">
</div>
</div>
<div class="control-group">
<div class="controls">
<button type="submit" value='login' class="btn">Login</button>
</div>
</div>
</form>
</div>
<script type="text/javascript">
$(document).ready(function(){
$(".btn").click(function (ev) {
ev.preventDefault() // cancel form submission
if ($(this).attr("value") == "auth") {
console.log("CHECK 1");
$.ajax({
type:'POST',
url:'/getotp2',
data:{
username:$('#username').val()
,csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
},
success: function server_response(response) {
//console.log('POST1 success')
}
});
}
else if ($(this).attr("value") == "login") {
console.log("CHECK 2");
$.ajax({
type:'POST',
url:'/otpcheck',
data:{
username:$('#username').val(),
otp:$('#otp').val(),
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
},
success: function server_response(response) {
const r = JSON.parse(response);
console.log(r.authresult);
if (r.authresult=='success'){
window.location.href='/main'; //also tried with './main','../main',''http://127.0.0.1:8000/main', none worked
} else{
alert("Auth Failed");
}
}
});
}
});
});
</script>
</body>
</html>
views.py
def otplogin(request):
return render(request,'esearch/otplogin.html')
def getotp2(request):
logout(request)
global otp
username =otp = ''
if request.POST:
username = request.POST.get('username','')
otp = pyotp.TOTP('base32secret3232').now()
OTPEmail('You Auth',username,[],'Your auth is '+otp)
print ('POST'+username)
print ('POST'+otp)
return JsonResponse(json.dumps({'username':username,'otp':otp}),safe=False)
def otpcheck(request):
if request.POST:
otpentered=request.POST.get('otp','')
print(otpentered)
authresult='fail'
if otpentered==otp:
authresult='success'
print('POST'+authresult)
else:
print('POST'+authresult)
return JsonResponse(json.dumps({'authresult':authresult}),safe=False)
@login_required(login_url='/otplogin')
def search_index(request):
######
urls.py
urlpatterns = [
path('main', views.search_index, name='main'),
path('otplogin', views.otplogin,name="otplogin"),
path('getotp2', views.getotp2, name="getotp2"),
path('otpcheck', views.otpcheck, name="otpcheck"),]
Консоль печатает все нормально, но вместо этого страница перенаправляется на http://localhost:8000/otplogin?next=/main
в розыске http://localhost:8000/main
. Если я удаляю @login_required(login_url='/otplogin')
, он успешно перенаправляется, но я хочу, чтобы страницу /main
посетил пользователь только после получения success
в authresult
. Так как же сделать просмотр Django доступным только в результате перенаправления с других страниц. Спасибо.