1

ExtJs 4.2.1、Django 1.5.2、DB Postgresql 9.1 を使用しています。

Web サイトにログイン フォームがあり、ユーザーがツールバーのボタンをクリックすると表示されます。資格情報 (ユーザー名とパスワード) を入力して [送信] ボタンをクリックすると、この情報がサーバーに送信されます。

サーバー側では、view.py スクリプトが呼び出されます。具体的には、ログインの 1 つのメソッド (def request_login(request)) で、ログインとユーザー認証のチェックが行われます。これらの制御の後、テキスト「成功」または「エラー」を含む httpResponse がクライアントに送信されます。残念ながら、クライアントはメッセージを受け取りませんが、代わりに index.html ページを受け取ります。取引所のメッセージのタイプをjsonで変更しようとしましたが、結果は同じです...エラー/成功メッセージはなく、代わりにindex.htmlページが返されます。

一般的な状況を説明するDjangoのドキュメントを見ました:古典的な形式のクライアント(index.html)->送信をクリックして、メソッドPOSTでメッセージを送信->この情報を受信するメソッドを含むview.pyがあります->サーバーメッセージで応答を送信します。通常、ログインに失敗した場合は同じページにリダイレクトされ、ログインに成功した場合は別のページにリダイレクトされます。私の場合、ログインが同じページ (index.html) に戻るようにします。

ログインフォームコード:

var winLogin;

Ext.onReady(function(){
    Ext.tip.QuickTipManager.init(); //init tooltip

    //create a panel to login
    var loginFormPanel = Ext.create('Ext.form.Panel', {
        bodyPadding: 15,
        defaults: { //applying default settings to all added items
            anchor: '100%',
            xtype: 'textfield',
            vtype: 'alphanum',
            allowBlank: false,
        },
        fieldDefaults: {
            labelWidth: 80,
            labelAlign: 'left',
            msgTarget: 'side',
        },
        items: [{
                name: 'username',
                fieldLabel: 'User Name',
                minLength: 3,
                maxLength: 20,
            },{
                name: 'password',
                fieldLabel: 'Password',
                inputType: 'password',
                minLength: 4,
                maxLength: 16,
            },
        ],
        dockedItems: [
            {
                xtype: 'toolbar',
                dock: 'bottom',
                items: [
                    { xtype: 'tbfill' },
                    {
                        xtype: 'button',
                        itemId: 'cancel',
                        text: 'Cancel',
                        listeners: {
                            click: function() {
                                this.up('form').getForm().reset(); //reset all textfiled
                            }
                        }
                    },
                    {
                        xtype: 'button',
                        itemId: 'submit',
                        formBind: true,
                        text: "Submit",
                        listeners: {
                            click: function() {
                                var formPanel = this.up('form');
                                var user = formPanel.down('textfield[name=username]').getValue();
                                var pass = formPanel.down('textfield[name=password]').getValue();
                                if (formPanel.getForm().isValid()) {
                                    Ext.Ajax.request({
                                        url: 'editor/request_login',// call method in the django's view
                                        method: 'POST',
                                        params: {
                                            username: user,
                                            password: pass,
                                        },
                                        success: function (response, opts) {
                                            var text = response.responseText;
                                            Ext.Msg.alert('Success', text);
                                        },
                                        failure: function (response, opts) {
                                            var text = response.responseText;
                                            Ext.Msg.alert('Failure', text);
                                        },
                                    });
                                }
                            }
                        }
                    }
                ]
            }
        ]
    });

    //create window to contain panel
    winLogin = Ext.create('Ext.window.Window', {
        title: 'Login',
        closeAction: 'hide',
        height: 170,
        width: 360,
        layout: 'fit',
        iconCls: 'imgToolBarButtonLogin',
        resizable: false,
        draggable: false,
        modal: true,
        items: [
            loginFormPanel,
        ],
    });
    winLogin.center();
});

view.py (サーバー):

# Create your views here.
from django.contrib.auth import authenticate, login
from django.http import HttpResponse

def request_login(request):
    if request.method == 'POST':
        requser = request.POST['username']
        reqpass = request.POST['password']
        user = authenticate(username=requser, password=reqpass)
        if user is not None:
            if user.is_active:
                login(request, user)
                # Return a success message
                return HttpResponse("Success", content_type="text/plain")
            else:
                # Return a 'disabled account' error message
                return HttpResponse("Error: this account is disabled!", content_type="text/plain")
        else:
            # Return an 'invalid login' error message.
            return HttpResponse("Error: invalid login. Try again!", content_type="text/plain")

ログイン (JSON で変更):

...
                    {
                        xtype: 'button',
                        itemId: 'submit',
                        formBind: true,
                        text: "Submit",
                        listeners: {
                            click: function() {
                                var formPanel = this.up('form');
                                var user = formPanel.down('textfield[name=username]').getValue();
                                var pass = formPanel.down('textfield[name=password]').getValue();
                                if (formPanel.getForm().isValid()) {
                                    Ext.Ajax.request({
                                        url: 'editor/request_login',// call method in the django's view
                                        method: 'POST',
                                        params: {
                                            username: user,
                                            password: pass,
                                        },
                                        success: function (response, opts) {
                                            var json = Ext.JSON.decode(response.responseText);
                                            Ext.Msg.alert('Success', json['message']);
                                        },
                                        failure: function (response, opts) {
                                            var json = Ext.JSON.decode(response.responseText);
                                            Ext.Msg.alert('Failure', json['message']);
                                        },
                                    });
                                }
                            }
                        }
                    }
...

View.py (JSON で変更):

# Create your views here.
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
import json

def request_login(request):
    if request.method == 'POST':
        requser = request.POST['username']
        reqpass = request.POST['password']
        user = authenticate(username=requser, password=reqpass)
        response_data = {}
        if user is not None:
            if user.is_active:
                login(request, user)
                # Return a success message
                response_data['result'] = 'success'
                response_data['message'] = 'Has loged in'
                response_data['fullname'] = user.get_full_name()
                return HttpResponse(json.dumps(response_data), content_type="application/json")
            else:
                # Return a 'disabled account' error message
                response_data['result'] = 'disabled'
                response_data['message'] = 'this user is disabled'
                return HttpResponse(json.dumps(response_data), content_type="application/json")
        else:
            # Return an 'invalid login' error message.
            response_data['result'] = 'failed'
            response_data['message'] = 'invalid login'
            return HttpResponse(json.dumps(response_data), content_type="application/json")
4

1 に答える 1

0

わかりました、エラーを見つけました!url オプションのパスが間違っていました。

ありがとう

于 2014-01-30T19:42:17.577 に答える