【问题标题】:Django page not found, ajax request not working correctly找不到 Django 页面,ajax 请求无法正常工作
【发布时间】:2018-03-28 08:30:12
【问题描述】:

尝试向 django 服务器发送 ajax 请求并获得包含一些随机数据的响应。

首页正常,但是ajax请求报404错误如下:

Using the URLconf defined in bms_project.urls,
Django tried these URL patterns, in this order:

^headstation/
^admin/

 The current path, chart_data/, didn't match any of these.

You're seeing this error because you have <code>DEBUG = True</code> in
your Django settings file. Change that to <code>False</code>, and Django
will display a standard 404 page.

url 模式是在“headstation”目录中的 urls.py 文件中侦听,然后包含在普通 urls.py 脚本中。它适用于主页:

项目 urls.py

urlpatterns = [
url(r'^headstation/', include('headstation.urls')),
url(r'^admin/', admin.site.urls),
]

headstation urls.py

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^chart_data/$', views.chart_data, name='chart_data')
]

views.py

def index(request):
# get context of request from client
context = RequestContext(request)
# construct dictionary to pass template + context
context_dict = {'buildingName': 'The Building',
                'boldmessage': 'Put a message here'}

#render and return to client
return render_to_response('headstation/home.html', context_dict, context)

def chart_data(request):

if (request.method == 'POST'):
    dataX = [0,10,20,30,40,50,60]
    dataY = [25.0,24.2,25,24.0,24.5,25.1,25.5]

    response = {"x": dataX,
                "y": dataY}

return JsonResponse(response)

最后是 ajax 请求来自的 home.html:

<!DOCTYPE html>

<head>
    <title>Homepage</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

</head>

<body>
    <h1>{{ buildingName }}</h1>
    Hello, message: <strong>{{ boldmessage }}</strong><br />
    <a href="/another-page/">Link to another page</a><br />

    <h1>Chart</h1>

    <script>
        var timeArray = [0,10,20,30,40,50,60];
        var dataArray = [0,0,0,0,0,0,0];

        $.ajax({
            url: '/chart_data/',
            type:"POST",
            data: {
                'data': 'temperature'
            },
            dataType: 'json',
            success: function (data) {
                if (data) {
                    timeArray = data.x;
                    dataArray = data.y;
                    alert("recieved");
                }
            }
        });
    </script>

</body>

【问题讨论】:

  • 我认为网址应该是url: 'headstation/chart_data/',
  • 刚刚尝试过 - 当前路径 headstation/headstation/chart_data/ 与其中任何一个都不匹配。同样的错误!
  • 你试过chart_data/没有前导/吗?
  • 是的,也没有运气......
  • @csrf_exempt 并且已修复

标签: javascript jquery python ajax django


【解决方案1】:

您可以使用 ''(空格)代替 ^$。它对我有用。

url('^$', views.index, name='index'),
url('about/', views.about, name='about'),

【讨论】:

    【解决方案2】:

    在您的 url 正则表达式中删除 $ 之前的尾部斜杠或在 $ 之前使用 ?

    urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^chart_data$', views.chart_data, name='chart_data')
    ]
    

    您也可以在模板中将其命名为{% url 'app:url_name' %} 您还需要将 csrf 令牌与您的帖子数据一起传递。

    {% csrf_token %}
    <script>
        var timeArray = [0,10,20,30,40,50,60];
        var dataArray = [0,0,0,0,0,0,0];
    
        $.ajax({
            var csrftoken = $('[name="csrfmiddlewaretoken"]').val();
            url: {% url 'headstation:chart_data' %},
            type:"POST",
            data: {
                'data': 'temperature',
                'csrfmiddlewaretoken': csrftoken,
            },
            dataType: 'json',
            success: function (data) {
                if (data) {
                    timeArray = data.x;
                    dataArray = data.y;
                    alert("recieved");
                }
            }
        });
    </script>
    

    【讨论】:

    • 将 csrf_token 放在那里似乎会导致“意外”、“错误”
    • 确保您在温度后没有丢失,
    • 温度后面肯定有逗号
    • @PhilS 我已经更新了代码,尝试使用上面的 javascript(外部脚本代码){% csrf_token %},它会为您创建隐藏的 csrf 字段。然后,您可以按名称获取值。
    • 从只是添加 {% csrf_token %} 相同的意外逗号
    猜你喜欢
    • 2018-12-03
    • 2014-11-03
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2017-06-18
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多