为什么对 Django 驱动的应用程序使用 Ajax 和 Json 的 CRUD 操作如此缓慢?如果 7000 条记录是一个问题,我如何将它改进到秒?
Why CRUD Operations Using Ajax and Json for Django powered app is so slow?If being 7000 records is an issue, how can I improve it to seconds?
我正在对大约有 7000 个 records.Currently 的远程遗留 MySQL 数据库执行操作,更新/删除/创建大约需要 1.5 分钟 operation.I 还导入了必要的文件不包含在下面的 Views.py 中。
使用 dict() 有问题吗?我应该使用 Rest 吗?或者其他一些 API。任何建议将不胜感激!
代码如下:
plugin.js
$(document).ready(function(){
var ShowForm = function(){
var btn = $(this);
$.ajax({
url: btn.attr("data-url"),
type: 'get',
dataType:'json',
beforeSend: function(){
$('#modal-book').modal('show');
},
success: function(data){
$('#modal-book .modal-content').html(data.html_form);
}
});
};
var SaveForm = function(){
var form = $(this);
$.ajax({
url: form.attr('data-url'),
data: form.serialize(),
type: form.attr('method'),
dataType: 'json',
success: function(data){
if(data.form_is_valid){
$('#book-table tbody').html(data.book_list);
$('#modal-book').modal('hide');
} else {
$('#modal-book .modal-content').html(data.html_form)
}
}
})
return false;
}
// create
$(".show-form").click(ShowForm);
$("#modal-book").on("submit",".create-form",SaveForm);
//update
$('#book-table').on("click",".show-form-update",ShowForm);
$('#modal-book').on("submit",".update-form",SaveForm)
//delete
$('#book-table').on("click",".show-form-delete",ShowForm);
$('#modal-book').on("submit",".delete-form",SaveForm)
});
Views.py
# Fetching records with pagination
@login_required()
def book_list(request):
books = AvailstaticCopy.objects.all().order_by('-row_date')
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
context = {
'books': books
}
return render(request, 'books/book_list.html',context)
@login_required()
def save_all(request,form,template_name):
data = dict()
if request.method == 'POST':
if form.is_valid():
form.save()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all()
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
data['form_is_valid'] = False
context = {
'form':form
}
data['html_form'] = render_to_string(template_name,context,request=request)
return JsonResponse(data)
# Create new record
@login_required()
def book_create(request):
if request.method == 'POST':
form = AvailForm(request.POST)
else:
form = AvailForm()
return save_all(request,form,'books/book_create.html')
# Update record
@login_required()
def book_update(request,id):
book = get_object_or_404(AvailstaticCopy,id=id)
if request.method == 'POST':
form = AvailForm(request.POST,instance=book)
else:
form = AvailForm(instance=book)
return save_all(request,form,'books/book_update.html')
# Delete Record
@login_required()
def book_delete(request,id):
data = dict()
book = get_object_or_404(AvailstaticCopy,id=id)
if request.method == "POST":
book.delete()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all()
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
context = {'book':book}
data['html_form'] =
render_to_string('books/book_delete.html',context,request=request)
return JsonResponse(data)
我想,您的问题出在服务器响应上。在您更改服务器数据(删除、更新、创建)的所有视图中,您尝试 return 更新图书列表,但您不对图书查询集进行分页,并且 django 模板处理器需要花费大量时间来准备 html与所有书籍。我建议你添加像这样对查询集进行分页的函数:
def get_book_page(request, books):
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
return books
并将所有书籍查询集包装在您的视图中。还需要将它添加到 urls 页码作为 get 参数(例如 /update-book/1?page=2
),因为如果你不这样做,它将无法工作。
感谢您给我 hint.That 成功!我有这样的分页查询集:
def save_all(request,form,template_name):
data = dict()
paginate_by = 144
if request.method == 'POST':
if form.is_valid():
form.save()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all().order_by('-row_date')
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
data['form_is_valid'] = False
context = {
'form':form
}
data['html_form'] = render_to_string(template_name,context,request=request)
return JsonResponse(data)
我正在对大约有 7000 个 records.Currently 的远程遗留 MySQL 数据库执行操作,更新/删除/创建大约需要 1.5 分钟 operation.I 还导入了必要的文件不包含在下面的 Views.py 中。
使用 dict() 有问题吗?我应该使用 Rest 吗?或者其他一些 API。任何建议将不胜感激!
代码如下:
plugin.js
$(document).ready(function(){
var ShowForm = function(){
var btn = $(this);
$.ajax({
url: btn.attr("data-url"),
type: 'get',
dataType:'json',
beforeSend: function(){
$('#modal-book').modal('show');
},
success: function(data){
$('#modal-book .modal-content').html(data.html_form);
}
});
};
var SaveForm = function(){
var form = $(this);
$.ajax({
url: form.attr('data-url'),
data: form.serialize(),
type: form.attr('method'),
dataType: 'json',
success: function(data){
if(data.form_is_valid){
$('#book-table tbody').html(data.book_list);
$('#modal-book').modal('hide');
} else {
$('#modal-book .modal-content').html(data.html_form)
}
}
})
return false;
}
// create
$(".show-form").click(ShowForm);
$("#modal-book").on("submit",".create-form",SaveForm);
//update
$('#book-table').on("click",".show-form-update",ShowForm);
$('#modal-book').on("submit",".update-form",SaveForm)
//delete
$('#book-table').on("click",".show-form-delete",ShowForm);
$('#modal-book').on("submit",".delete-form",SaveForm)
});
Views.py
# Fetching records with pagination
@login_required()
def book_list(request):
books = AvailstaticCopy.objects.all().order_by('-row_date')
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
context = {
'books': books
}
return render(request, 'books/book_list.html',context)
@login_required()
def save_all(request,form,template_name):
data = dict()
if request.method == 'POST':
if form.is_valid():
form.save()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all()
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
data['form_is_valid'] = False
context = {
'form':form
}
data['html_form'] = render_to_string(template_name,context,request=request)
return JsonResponse(data)
# Create new record
@login_required()
def book_create(request):
if request.method == 'POST':
form = AvailForm(request.POST)
else:
form = AvailForm()
return save_all(request,form,'books/book_create.html')
# Update record
@login_required()
def book_update(request,id):
book = get_object_or_404(AvailstaticCopy,id=id)
if request.method == 'POST':
form = AvailForm(request.POST,instance=book)
else:
form = AvailForm(instance=book)
return save_all(request,form,'books/book_update.html')
# Delete Record
@login_required()
def book_delete(request,id):
data = dict()
book = get_object_or_404(AvailstaticCopy,id=id)
if request.method == "POST":
book.delete()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all()
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
context = {'book':book}
data['html_form'] =
render_to_string('books/book_delete.html',context,request=request)
return JsonResponse(data)
我想,您的问题出在服务器响应上。在您更改服务器数据(删除、更新、创建)的所有视图中,您尝试 return 更新图书列表,但您不对图书查询集进行分页,并且 django 模板处理器需要花费大量时间来准备 html与所有书籍。我建议你添加像这样对查询集进行分页的函数:
def get_book_page(request, books):
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
return books
并将所有书籍查询集包装在您的视图中。还需要将它添加到 urls 页码作为 get 参数(例如 /update-book/1?page=2
),因为如果你不这样做,它将无法工作。
感谢您给我 hint.That 成功!我有这样的分页查询集:
def save_all(request,form,template_name):
data = dict()
paginate_by = 144
if request.method == 'POST':
if form.is_valid():
form.save()
data['form_is_valid'] = True
books = AvailstaticCopy.objects.all().order_by('-row_date')
page = request.GET.get('page', 1)
paginator = Paginator(books, 144)
try:
books = paginator.page(page)
except PageNotAnInteger:
books = paginator.page(1)
except EmptyPage:
books = paginator.page(paginator.num_pages)
data['book_list'] = render_to_string('books/book_list_2.html',
{'books':books})
else:
data['form_is_valid'] = False
context = {
'form':form
}
data['html_form'] = render_to_string(template_name,context,request=request)
return JsonResponse(data)