Python 通过向URL传递参数,使用Django和Ajax从本地数据库获取数据,返回404错误
我正在尝试使用Django和Ajax从本地数据库获取数据。 我设置了一个视图,用户可以在其中获取数据,并可以传入参数来过滤数据:开始日期、结束日期和站点id。 基本上,我希望将参数传递给views.py以过滤数据,但目前我并不关心参数是否反映在url中,只要返回的json是基于传递的参数过滤的。 当我测试是否可以从数据库成功获取数据时,我得到一个页面未找到404错误: 找不到页面404 请求方法:获取 请求URL: 错误 Django使用acoustic_viz.URL中定义的URLconf,按照以下顺序尝试了这些URL模式: ^管理员/ ^获取数据/ ^获取站点/ ^$ ^静态/?p*$ 当前URL acoustic_viz/get data/,与其中任何一个都不匹配 是因为我通过的论点吗?如果是这样,我如何更改我的url.py,以便Django能够找到带有参数的url 这是我的密码 acoustic_viz/index.htmlPython 通过向URL传递参数,使用Django和Ajax从本地数据库获取数据,返回404错误,python,json,ajax,django,Python,Json,Ajax,Django,我正在尝试使用Django和Ajax从本地数据库获取数据。 我设置了一个视图,用户可以在其中获取数据,并可以传入参数来过滤数据:开始日期、结束日期和站点id。 基本上,我希望将参数传递给views.py以过滤数据,但目前我并不关心参数是否反映在url中,只要返回的json是基于传递的参数过滤的。 当我测试是否可以从数据库成功获取数据时,我得到一个页面未找到404错误: 找不到页面404 请求方法:获取 请求URL: 错误 Django使用acoustic_viz.URL中定义的URLconf,按
var dateStart = {key:'2016-10-28'};
var dateEnd = {key:'2016-10-30'};
var siteID = {key:'HENTONAOP'};
$("#test").on('click',function(){
console.log("test");
$.getJSON('/acoustic_viz/get-data/',
{date_start: dateStart.key, date_end:dateEnd.key, site_id: siteID.key })
// when the data comes back from the server
.done(function(data) {
console.log(data);
});
});
acoustic_viz/acoustic_viz/url.py
from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
import queries.views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/', queries.views.get_data),
url(r'^get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
声学_viz/querys/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Data, Sites
import datetime
import json
class JSONResponse(HttpResponse):
"""
An HttpResponse that renders its content into JSON.
"""
def __init__(self, data, **kwargs):
content = json.dumps(data)
kwargs['content_type'] = 'application/json'
super(JSONResponse, self).__init__(content, **kwargs)
class CSVResponse(HttpResponse):
"""
An HttpResponse that renders its contents as a CSV.
'rows' should be a list of dict objects, with each entry corresponding to 1 CSV field.
'fields' is the ordered list of field names in the CSV.
"""
def __init__(self, rows, fields, **kwargs):
csvfile = StringIO()
# Write header with field names
headerwriter = csv.writer(csvfile)
headerwriter.writerow(fields)
# Write CSV rows
writer = csv.DictWriter(csvfile, fields, extrasaction='ignore')
for row in rows:
writer.writerow(row)
kwargs['content_type'] = 'text/csv'
super(CSVResponse, self).__init__(csvfile.getvalue(), **kwargs)
self['Content-Disposition'] = 'attachment'
def errorResponse(errormessage, format, extraJSON={}):
"""
A nice standardized way to show the user an error message.
"""
if format == 'csv':
return CSVResponse(
[{'errormessage': errormessage}],
fields=('errormessage',) )
else:
json_objects = extraJSON.copy()
json_objects['error'] = True
json_objects['errormessage'] = errormessage
return JSONResponse(json_objects)
def hello_peeg(request):
return HttpResponse('hello peeg')
def get_sites(request):
sites = Sites.objects.all().order_by('int_id')
json_objects = [{'site': (s.site_id + ', ' + s.site_name)} for s in sites]
return JSONResponse({'sites': json_objects})
def get_data(request):
filtered = False
data = Data.objects.all().order_by('data_entry_id')
startDate = request.GET.get('date_start')
endDate = request.GET.get('date_end')
siteID = request.GET.get('site_id')
if startDate and endDate and siteID:
filtered = True
# __range: SELECT * WHERE date_recorded BETWEEN startDate and endDate;
data = Data.objects.filter(date_recorded__range=(startDate, endDate), site_id=siteID)
if not filtered: # error message if the user didn't supply an argument to filter the species list
json_objects = [{'data': (d.date_recorded+ ' ' + d.time_recorded+ ' ' + d.average)} for d in data]
#return errorResponse("Please supply a 'date_start', 'date_end', and 'site_id' argument.", format, {"data":[]})
else:
json_objects = [{'data': (d.data_entry_id + ' ' + d.site_id + ' ' + d.date_recorded+ ' ' + d.time_recorded+ ' ' + d.average)} for d in data]
return JSONResponse({'data': json_objects})
这是我第一次尝试编写Django应用程序,因此如果有任何帮助,我将不胜感激。我想你忘了用$符号结束你的url模式 你应该有这个
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/$', queries.views.get_data),
url(r'^get-sites/$', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
而不是这个
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^get-data/', queries.views.get_data),
url(r'^get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
如果遇到任何错误,一定要告诉我
干杯 您试图打开“/acoustic_viz/get data/”,但在url.py中,所有URL都没有/acoustic_viz/前缀。尝试更改index.html模板文件中的url
$.getJSON('/get-data/')
或者在URL.py文件内的URL中添加声学viz:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^acoustic_viz/get-data/', queries.views.get_data),
url(r'^acoustic_viz/get-sites/', queries.views.get_sites),
url(r'^$', queries.views.hello_peeg),
]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
还请注意,您不需要在django模板中硬编码URL。您可以命名URL并使用标记。这里的核心问题是您已将project应用程序用作项目中的应用程序。您可以这样做,但这就是为什么URL没有前缀的原因。这篇文章很早就解释了组件。我以前也犯过同样的错误,但我解决了我的问题,谢谢!