Django - JSONDecodeError при обработки request.body
мне необходимо из формы передать много данных. Для этого при помощи JS я упаковал их в JSON-форма. В console.log все данные выглядят так как нужно. Вот
$('#generatorsData').submit(function() {
event.preventDefault();
function getTableData(table, keys) {
const rows = table.querySelectorAll('tbody tr');
return Array.from(rows).slice(1).map(row => {
const columns = row.querySelectorAll('td');
return keys
.reduce((acc, key, index) => {
const value = columns[index] && columns[index].textContent;
return {...acc, [key]: value};
}, {})
})
}
var percent_4_5_data = getTableData( $('#percent-4-5')[0], ['subject', 'year', 'all_count', 'stud_5', 'stud_4', 'percent'] );
const data = new FormData($(this)[0]);
const value = Object.fromEntries(data.entries());
var tables = {
percent_4_5_table: percent_4_5_data
}
var obj = $.extend({}, value, tables);
const json_values = JSON.stringify(obj, null, 2);
console.log(json_values);
var response;
if(response){
response.abort();
}
response = $.ajax({
url: {% url 'generate' %},
data: json_values,
type: 'GET',
contentType: 'application/json; charset=utf-8',
success: function(){
console.log('success');
},
error: function(){
console.log('failure');
}
});
});
В tables
будет больше таблиц, данные которых будут сформированы с помощью getTableData
views.py:
from __future__ import print_function
from email import message
import json
from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.signals import user_logged_in, user_logged_out
from django.contrib.staticfiles import finders
from django.contrib import messages
from django.core.files.storage import FileSystemStorage
from django.views.decorators.csrf import csrf_protect
from .portfolio import generate
user_logged = False
# Create your views here.
def index(request):
list(messages.get_messages(request))
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('generator')
else:
messages.error(request, 'Неправильный логин или пароль')
return redirect('index')
else:
return render(request , 'main/index.html')
def record_user_logged_in(sender, user, request, **kwargs):
global user_logged
user_logged = True
def record_user_logged_out(sender, user, request, **kwargs):
global user_logged
user_logged = False
user_logged_in.connect(record_user_logged_in)
user_logged_out.connect(record_user_logged_out)
def logout_user(request):
logout(request)
return redirect('index')
def is_ajax(request):
return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
def generator(request):
if user_logged:
""" upload = request.FILES['diplom_image']
fss = FileSystemStorage()
file = fss.save(upload.name, upload)
file_url = fss.url(file)
doc_path = finders.find('media/docs/template.docx') """
return render(request, 'main/generator.html')
else:
return redirect('index')
@csrf_protect
def generate(request):
if is_ajax(request):
req = json.loads(request.body.decode("utf-8"))
else:
return HttpResponse('No Data')
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('generator/', views.generator, name='generator'),
path('generate/', views.generate, name='generate'),
path('logout', views.logout_user, name='logout')
]
Traceback:
Internal Server Error: /generate/
Traceback (most recent call last):
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
response = get_response(request)
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\decorators.py", line 133, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "C:\OpenServer\django test\mysite\main\views.py", line 67, in generate
req = json.loads(request.body.decode("utf-8"))
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\EmperorBeliver\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
[30/May/2022 12:04:17] "GET /generate/?{%20%20%22csrfmiddlewaretoken%22:%20%22Gv0fCUS2lGSwZLl4NVqsJw77VuGqL9DjKW8kjHVLOeJkzVm4HN2REYMokYE6aCeh%22,%20%20%22fio%22:%20%22%22,%20%20%22short_fio%22:%20%22%22,%20%20%22teacher_type%22:%20%22%22,%20%20%22year%22:%20%22%22,%20%20%22date_birth%22:%20%22%22,%20%20%22hire_date%22:%20%22%22,%20%20%22teacher_exp%22:%20%22%22,%20%20%22cur_post_exp%22:%20%22%22,%20%20%22cur_comp_exp%22:%20%22%22,%20%20%22education%22:%20%22%22,%20%20%22academic_degree%22:%20%22%22,%20%20%22additional_prof_info%22:%20%22%22,%20%20%22last_qualiton_certification%22:%20%22%22,%20%20%22category_num%22:%20%22%22,%20%20%22author_courses%22:%20%22%22,%20%20%22extra_activites%22:%20%22%22,%20%20%22acitivity_in_olympic%22:%20%22%22,%20%20%22olympic_winner_exists%22:%20%22%22,%20%20%22awarded_exists%22:%20%22%22,%20%20%22paric_dev_org%22:%20%22%22,%20%20%22self_improve_activ%22:%20%22%22,%20%20%22prov_assis%22:%20%22%22,%20%20%22using_modern_tech%22:%20%22%22,%20%20%22implamin_individ_program%22:%20%22%22,%20%20%22use_ikt_tech%22:%20%22%22,%20%20%22work_exp_other_level%22:%20%22%22,%20%20%22screen_home%22:%20%22%22,%20%20%22acc_screen%22:%20%22%22,%20%20%22involved_other_lvl%22:%20%22%22,%20%20%22exec_master%22:%20%22%22,%20%20%22perf_seminar%22:%20%22%22,%20%20%22conduct_traning_session%22:%20%22%22,%20%20%22expert_commision%22:%20%22%22,%20%20%22avail_research_activ%22:%20%22%22,%20%20%22perct_year_1%22:%20%22%22,%20%20%22perct_year_2%22:%20%22%22,%20%20%22perct_year_3%22:%20%22%22,%20%20%22perct_1%22:%20%22%22,%20%20%22perct_2%22:%20%22%22,%20%20%22perct_3%22:%20%22%22,%20%20%22percent_description%22:%20%22%22,%20%20%22dynamic_description%22:%20%22%22,%20%20%22ratio_description%22:%20%22%22,%20%20%22courses_description%22:%20%22%22,%20%20%22fio3%22:%20%22%22,%20%20%22year3%22:%20%22%22,%20%20%22classes3%22:%20%22%22,%20%20%22program_list%22:%20%22%22,%20%20%22order_date%22:%20%22%22,%20%20%22order_num%22:%20%22%22,%20%20%22protocol_num%22:%20%22%22,%20%20%22protocol_date%22:%20%22%22,%20%20%22program_name%22:%20%22%22,%20%20%22program_subject%22:%20%22%22,%20%20%22program_object%22:%20%22%22,%20%20%22program_hours%22:%20%22%22,%20%20%22year4%22:%20%22%22,%20%20%22subject%22:%20%22%22,%20%20%22student_subject%22:%20%22%22,%20%20%22subject_year%22:%20%22%22,%20%20%22subject_name%22:%20%22%22,%20%20%22subject_start_perc%22:%20%22%22,%20%20%22subject_end_perc%22:%20%22%22,%20%20%22qual_fperc%22:%20%22%22,%20%20%22qual_enqual%22:%20%22%22,%20%20%22qual_fclass%22:%20%22%22,%20%20%22qual_sclass%22:%20%22%22,%20%20%22qual_sec_fperc%22:%20%22%22,%20%20%22qual_sec_enperc%22:%20%22%22,%20%20%22stud_perc%22:%20%22%22,%20%20%22fyear%22:%20%22%22,%20%20%22syear%22:%20%22%22,%20%20%22fio_get4%22:%20%22%22,%20%20%22year2%22:%20%22%22,%20%20%22some_class%22:%20%22%22,%20%20%22some_class_count%22:%20%22%22,%20%20%22alpha_count%22:%20%22%22,%20%20%22prefer_count%22:%20%22%22,%20%20%22accept_count%22:%20%22%22,%20%20%22poor_count%22:%20%22%22,%20%20%22lead_class%22:%20%22%22,%20%20%22leader_name%22:%20%22%22,%20%20%22diag_year%22:%20%22%22,%20%20%22special_stud_names%22:%20%22%22,%20%20%22special_stud_ex%22:%20%22%22,%20%20%22special_olympic%22:%20%22%22,%20%20%22spravka_date%22:%20%22%22,%20%20%22get_town_activity%22:%20%22%22,%20%20%22trainer_list%22:%20%22%22,%20%20%22mod_program_list%22:%20%22%22,%20%20%22passport_image%22:%20{},%20%20%22labor_image%22:%20{},%20%20%22diplom_image%22:%20{},%20%20%22load_image%22:%20{},%20%20%22qual_image%22:%20{},%20%20%22attectat_image%22:%20{},%20%20%22add_program_image%22:%20{},%20%20%22olympic_winner_image%22:%20{},%20%20%22qual_system_image%22:%20{},%20%20%22order_image%22:%20{},%20%20%22spravka_image%22:%20{},%20%20%22screen_home_image%22:%20{},%20%20%22acc_screen_image%22:%20{},%20%20%22percent_4_5_table%22:%20[%20%20%20%20{%20%20%20%20%20%20%22subject%22:%20%22ALDFI%22,%20%20%20%20%20%20%22year%22:%20%222902%22,%20%20%20%20%20%20%22all_count%22:%20%2260%22,%20%20%20%20%20%20%22stud_5%22:%20%2220%22,%20%20%20%20%20%20%22stud_4%22:%20%2220%22,%20%20%20%20%20%20%22percent%22:%20%2266.67%%22%20%20%20%20}%20%20]} HTTP/1.1" 500 114371