【问题标题】:Django JSON not sending proper dataDjango JSON 没有发送正确的数据
【发布时间】:2017-01-01 04:37:27
【问题描述】:

我正在开发一个 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 很好”,它也会返回“失败”。谁能建议我哪里出错了?

【问题讨论】:

  • 显然,request.is_ajax() 是假的。 this other question 的答案可能会有所帮助。测试时如何发送请求?它必须有一个特定的标头才能让它看起来是一个 ajax 请求。具体来说,HTTP_X_REQUESTED_WITH 标头必须等于“XMLHttpRequest”。
  • 我正在从我的网页发送一个 ajax 请求

标签: python json django


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看django documentation 并检查您的HTTP 请求是否将HTTP 标头HTTP_X_REQUESTED_WITH 设置为字符串“XMLHttpRequest”。然后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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2017-08-10
      • 2018-07-20
      • 1970-01-01
      相关资源
      最近更新 更多