2

我正在尝试进行类似于 StackOverflow 的身份验证设置,除非有一些需要身份验证的特权操作(在此之前不要打扰用户),否则正常浏览不会受到影响。

如果未登录,则应为“登录”,如果已登录,则应为“用户名”。

base.html 的相关部分(来自 fallr.net)(由 index.html 扩展)如下所示:

            <script type="text/javascript">
            //<![CDATA[

            $(document).ready(function(){

            var methods = {

            forms : function(){
            var login = function(){
            var user = $(this).children('form').children('input[type="text"]').val();
            var pass = $(this).children('form').children('input[type="password"]').val();
            var dataString = '&username=' + $('input[name=username]').val() + '&password=' + $('input[name=password]').val();
            if(user.length < 1 || pass.length < 1){
            alert('Invalid!\nPlease fill all required forms');
            } else {
            alert('username: '+user+'\npassword: '+pass);
            $.ajax({
            type: "POST",
            url: "/login",
            dataType: "html",
            data: {
            username : user,
            password : pass,
            csrfmiddlewaretoken : '{{ csrf_token }}'
            },
            success: function(json){alert (json.server_response);},
            error: function(xhr,errmsg,err) { alert(xhr.status + ": " + xhr.responseText); }
            });
            $.fallr('hide');
            return false;
            }
            }

            $.fallr('show', {
            icon        : 'secure',
            width       : '320px',
            content     : '<h4>Sign in</h4>'
            + '<form>'
            +     '<input name="username" placeholder="username" type="text"/'+'>'
            +     '<input name="password" placeholder="password" type="password"/'+'>'
            + '</form>',
            buttons : {
            button1 : {text: 'Submit', onclick: login},
            button4 : {text: 'Cancel'}
            }
            });
            }
            };

            //button trigger
            $('a[href^="#fallr-"]').click(function(){
            var id = $(this).attr('href').substring(7);
            methods[id].apply(this,[this]);
            return false;
            });

            // syntax highlighter
            hljs.tabReplace = '    ';
            hljs.initHighlightingOnLoad();
            });

            //]]>
            </script>

urls.py 看起来像:

            from django.conf.urls import patterns, include, url
            #from triplanner.views import *


            # Uncomment the next two lines to enable the admin:
            # from django.contrib import admin
            # admin.autodiscover()

            urlpatterns = patterns('',
            url(r'^$', main_page),
            url(r'^login$',ajax_login),                 
            url(r'^login/$','django.contrib.auth.views.login'),
            url(r'^logout/$', logout_page),

            # our application page
            url(r'^account/',include('tripapp.urls')),              
            )

另外,'^login/$' 是以前的学习实现,我想用 Ajax 登录代替。

还有我的views.py:

            # -*- coding: utf-8 -*-
            from django.contrib.auth import logout
            from django.http import HttpResponseRedirect
            from django.shortcuts import render_to_response
            from django.contrib.auth import authenticate, login
            #from django.http import HttpResponse
            from django.template import RequestContext
            #from django.utils import simplejson



            def main_page(request):
            return render_to_response('index.html', context_instance=RequestContext(request))


            def logout_page(request):
            """
            Log users out and redirect them to the main page
            """
            logout(request)
            return HttpResponseRedirect('/')


            def ajax_login(request):
            """  
            This view logs a user in using the POST data.
            """

            if request.method == 'POST':
            print request.POST['username']
            username = request.POST['username']
            password = request.POST['password']
            print username
            print password
            user = authenticate(username=username, password=password)
            if (not user is None) and (user.is_active):
            login(request, user)
            response_dict = {}
            response_dict.update({'server_response': username})
            #return HttpResponse(simplejson.dumps(response_dict),mimetype='applicaion/javascript')
            return render_to_response('index.html',{'username' : user}, context_instance=RequestContext(request))
            # Set Session Expiry to 0 if user clicks "Remember Me"
            #if not request.POST.get('rem', None):
            #   request.session.set_expiry(0)
            #data = username
            else:
            return render_to_response('index.html', context_instance=RequestContext(request))

我收到 403 错误,例如“[20/Aug/2013 00:29:20]”POST / HTTP/1.1“403 2294”

更新编号 1

使用更改后的 urls.py、views.py 和 javascript,我能够得到 200 响应,但它给出的警报窗口显示未定义并提醒我“阻止此页面创建对话框”

4

2 回答 2

1

我使用的方法是拥有一个Tastypie api 层并要求对 API 进行身份验证。如果API调用因为认证失败,客户端可以通过ajax登录方式请求用户登录。

您可以使用此要点通过 ajax 登录用户

于 2013-08-23T11:14:57.023 回答
0

所以,看起来你目前的问题是这样的:alert (json.server_response);。您可能需要考虑将$.ajax dataType参数更改为json.

引用文档:

您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生一个 JavaScript 对象,在 1.4 中脚本将执行脚本,其他任何内容都将是作为字符串返回)。可用的类型(以及作为第一个参数传递给成功回调的结果)是:...

“html”:以纯文本形式返回 HTML;包含的脚本标签在插入 DOM 时进行评估。

“json”:将响应评估为 JSON 并返回一个 JavaScript 对象。JSON数据被严格解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应该返回 null 或 {} 的响应。(有关正确的 JSON 格式的更多信息,请参阅 json.org。)

于 2013-08-22T13:37:29.950 回答