3

form.html

<form action='/login/' method = 'post'>
    {% csrf_token %}
    <label>Email: (*)</label><input type='text' name='email' value='' /><br />
    <label>Password: </label><input type='password' name='password' value='' /><br />
    <input type='submit' name='submit' value='Log in' />
</form>

そしてviews.py私はrender_to_responseではなくHttpResponseを使用します

def login(request):
    success = False
    message = ''

    try:
        emp = Employee.objects.get(email = request.POST['email'])
        if emp.password == md5.new(request.POST['password']).hexdigest() :
            emp.token = md5.new(request.POST['email'] + str(datetime.now().microsecond)).hexdigest()
            emp.save()
            info = serializers.serialize('json', Employee.objects.filter(email = request.POST['email']))
            success = True
            return HttpResponse(json.dumps({'success':str(success).lower(), 'info':info}))
        else:
            message = 'Password wrong!'
            return HttpResponse(json.dumps({'success':str(success).lower(), 'message':message}), status = 401)
    except:
        message = 'Email not found!'
        return HttpResponse(json.dumps({'success':str(success).lower(), 'message':message}), status = 401)

render_to_response を使用する場合は、RequestContext を追加するだけですが、HttpResponse を追加する場合は、どうすればよいかわかりません。

私はDjango 1.4を使用しています
が、どこに問題がありますか

=========================

HTML をレンダリングする関数を変更すると、私の問題は解消されます。

def homepage(request):
    return render_to_response('index.html')

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

それはばかげた間違いです...ありがとう...

4

2 に答える 2

2

ajax を使用してフォームを送信し、jQuery を組み込んでいる場合、次の 2 つの可能性があります。

  1. csrfmiddlewaretoken データを POST 要求に手動で追加する
  2. jQuery ajax リクエスト ヘッダーを変更して CSRF トークン処理を自動化する

1. csrfmiddlewaretoken を手動で追加します

var data = {
    csrfmiddlewaretoken: $('#myForm input[name=csrfmiddlewaretoken]').val(),
    foo: 'bar',
};

$.ajax({
    type: 'POST',
    url: 'url/to/ajax/',
    data: data,
    dataType: 'json',
    success: function(result, textStatus, jqXHR) {
        // do something with result
    },
});

2. CSRF トークンの処理を自動化する

jQuery(document).ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    function sameOrigin(url) {
        // url could be relative or scheme relative or absolute
        var host = document.location.host; // host + port
        var protocol = document.location.protocol;
        var sr_origin = '//' + host;
        var origin = protocol + sr_origin;
        // Allow absolute or scheme relative URLs to same origin
        return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
            (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
            // or any other URL that isn't scheme relative or absolute i.e relative.
            !(/^(\/\/|http:|https:).*/.test(url));
    }
    function safeMethod(method) {
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }

    if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});

しかし: ajax リクエスト ヘッダーを変更することは悪い習慣だと言われています。したがって、私はソリューション番号1を使用します。

ソース:クロス サイト リクエストの偽造防止: AJAX

于 2012-06-22T09:37:01.307 に答える
-3

Django Documentation ( CSRF DOC LINK ) は、それを有効にする方法を明確に説明しています。

これは、csrf トークンを有効にしてビューを書き込む基本的な方法です。

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def form(request):
    if request.method == 'GET':
            #your code
            context = {}
            return render (request, "page.html", context )
于 2012-06-22T09:04:16.953 に答える