Django - Ajax: отправка параметров URL в данных

Я пытаюсь отправить запросы «GET» и «POST» на сервер Django через Ajax. Сначала я предоставляю URLConf:

url(r'^write_to_file/(?P<file_name>.*)/(?P<content>.*)/$',generalFunctions.write_to_file, name ='write_to_file'),

Теперь часть AJAX. Раньше я делал это так (избегая отправки параметров в данных)

$.ajax({
        type: "GET",
        url: '/write_to_file/' + file_name + '/' + content ,
        data: {},
        success: function(data){ 
            alert ('OK');
        },
        error: function(){
            alert("Could not write to server file " + file_name) 
        }
    }); 

До определенного момента меня этот способ устраивал, но сейчас мне важно передать имя_файла и содержимое через переменную data и почему-то получаю 404 Error.

$.ajax({
        type: "GET",
        url: '/write_to_file/',
        data: {'file_name':file_name, 'content':content},

        success: function(data){ 
             alert ('OK');
        },
        error: function(){
            alert("Could not write to server file " + file_name) 
        }
    });

Ошибка на стороне сервера:

Not Found: /write_to_file/
[15/Apr/2016 14:03:21] "GET /write_to_file/?file_name=my_file_name&content=my_content HTTP/1.1" 404 6662

Ошибка на стороне клиента:

jquery-2.1.1.min.js:4 GET http://127.0.0.1:8000/write_to_file/?file_name=my_file_name&content=my_content 404 (Not Found)

Есть идеи, почему? Что-то не так с синтаксисом ajax или как-то связано с URLConf?


person Edgar Navasardyan    schedule 15.04.2016    source источник


Ответы (1)


url(r'^write_to_file/(?P<file_name>.*)/(?P<content>.*)/$',generalFunctions.write_to_file, name ='write_to_file'),

теперь неправильно, URL-адрес, на который вы отправляете почтовый запрос: /write_to_file/

url(r'^write_to_file/$',generalFunctions.write_to_file, name ='write_to_file'),

это то, что вы хотите, я думаю!

person Georgina S    schedule 15.04.2016
comment
Ну, это уже не ошибка 404, а ошибка 505, и причина не в самом представлении (я поставил точку останова в самом начале функции, и отладчик не дошел до этой точки). Теперь ошибка TypeError: write_to_file() принимает ровно 3 аргумента (1 указан) [15/Apr/2016 14:20:48] GET /write_to_file/?file_name=my_file_name&content=my_content HTTP/1.1 500 16010 - person Edgar Navasardyan; 15.04.2016
comment
Это действительно должно быть очевидно: если вы больше не передаете эти значения в URL-адресе, вам нужно удалить их как параметры функции. - person Daniel Roseman; 15.04.2016
comment
Да, поэтому, если вы определили представление write_to_file, вам нужно будет удалить любые параметры, которые вы могли объявить, кроме запроса. например def запись_в_файл(запрос, имя_файла, содержимое): ... должно стать определением запись_в_файл(запрос):... - person Georgina S; 15.04.2016
comment
Ну, извините за тупость, но если я их удалю, то как мне получить доступ из представления Django к тому, что я передал через данные Ajax?! - person Edgar Navasardyan; 15.04.2016
comment
(в представлении) имя_файла = request.GET.get('имя_файла') и что-то подобное для содержимого, также взгляните на request.GET.getlist() - person Georgina S; 15.04.2016
comment
Спасибо за это ! Оказывается, таким образом я не могу накладывать какие-либо ограничения регулярных выражений на переменные URL (например, в данном случае имя файла и содержимое) - person Edgar Navasardyan; 15.04.2016