Python 通过向URL传递参数,使用Django和Ajax从本地数据库获取数据,返回404错误

Python 通过向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,按

我正在尝试使用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.html

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没有前缀的原因。这篇文章很早就解释了组件。我以前也犯过同样的错误,但我解决了我的问题,谢谢!