Django JSON没有发送正确的数据

时间:2016-08-24 21:47:25

标签: python json django

我正在开发一个django python Web应用程序。在我的网页中,我通过发送“期限”向我的API发送请求,我的API应该返回搜索的“内容”字段。

我的内容在我的数据库中包含'xxx很好'。

这是我在views.py

中的代码
def get_RuleStatement(request):
    if request.is_ajax():
        q = request.GET.get('term', '')
        rule_statements = RuleStatement.objects.filter(content__icontains = q )[:1]
        results = []
        for rule_statement in rule_statements:
            rule_statement_json = {}
            rule_statement_json['content'] = rule_statement.content
            results.append(rule_statement_json)
        data = json.dumps(results)
    else:
        data = 'fail'
    mimetype = 'application/json'
    return HttpResponse(data, mimetype)

出于某种原因,每当我发送以下请求时:http://website.com/api/get_RuleStatement/?term=xxx

即使我的数据库包含数据'xxx很好',它也会返回'fail'。任何人都可以建议我哪里出错了吗?

2 个答案:

答案 0 :(得分:0)

可能的唯一原因是is_ajax()返回False。这意味着您没有提出AJAX请求。我相信你正在对你的终端进行正常的HTTP调用。

答案 1 :(得分:0)

请参阅django documentation并检查您的HTTP请求是否已使用字符串'XMLHttpRequest'设置HTTP标头HTTP_X_REQUESTED_WITH。然后request.is_ajax()将返回True

注意像jQuery这样的现代库会自动为你设置这个HTTP头;例如,如果你得到jquery并且

<script>
$.get('/api/get_RuleStatement', {'term': 'xxx'})
</script>

或者,您可以删除if request.is_ajax():行并将其设为

def get_RuleStatement(request):
    q = request.GET.get('term', '')
    rule_statements = RuleStatement.objects.filter(content__icontains = q)[:1]
    results = []
    for rule_statement in rule_statements:
        results.append({'content': rule_statement.content})
    data = json.dumps(results)
    mimetype = 'application/json'
    return HttpResponse(data, mimetype)

如果你不关心它是一个ajax调用,并希望能够看到响应,否则。此外,您可能需要考虑使用JsonResponse而不是HttpResponse,因此您不必自己序列化或设置MIME类型。例如,

def get_RuleStatement(request):
    q = request.GET.get('term', '')
    rule_statements = RuleStatement.objects.filter(content__icontains = q)[:1]
    results = []
    for rule_statement in rule_statements:
        results.append({'content': rule_statement.content})
    return JsonResponse(results, safe=False) 
           # the safe = False is neccessary when
           # you serialize non-dicts like results which is a list