Джанго: как сделать так, чтобы просмотр посещался только при перенаправлении - PullRequest
1 голос
/ 10 ноября 2019

Привет! Я читал это представление 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 доступным только в результате перенаправления с других страниц. Спасибо.

...