【问题标题】:django: ajax view structuredjango:ajax 视图结构
【发布时间】:2010-06-08 18:18:11
【问题描述】:

我想知道在 django 中构建 ajax 视图的正确方法。

说我做了类似的事情:

def foo_json(request):
    if is_ajax():
        # return JSON here

并将其作为资源提供,例如 '/foo/data/'..

一切都好……

但是如果我将浏览器指向 '/foo/data/' .. 显然我会收到一个错误(调试),例如:app.views.foo_json didn't return an HttpResponse object.

所以...我的问题是:

构建这种视图的最佳方式是什么?

..我应该返回一个 HTTP 响应代码 ..也许是 404 / 405 ... 还是别的什么? - 不确定处理这个问题的最佳方法,任何建议表示赞赏:)

编辑:..触发这个问题的用例是 ajax 代理视图:

def foo_proxy(request):
    if is_ajax():
        # proxy external URL
        # return resource
    else: 
        # ? do what with browser request

【问题讨论】:

    标签: ajax django


    【解决方案1】:

    检查 is_ajax 有充分的理由,因为它是利用跨域策略的好方法。

    在这种情况下,我会返回 403 - Forbidden。请注意,403 与授权无关 - 这是您已收到并理解请求的确认,并且拒绝返回任何与您的意图完全匹配的内容。您可以选择包含拒绝请求的原因:

    您可以使用 status 参数设置常规 HttpResponse 对象的状态,或使用 HttpResponseForbidden 子类:

    return HttpResponseForbidden("Request must be a valid XMLHttpRequest")
    

    就个人而言,我倾向于重复使用相同的视图来为常规 GET 提供模板,或为 ajax 请求提供 JSON。我不知道我是否会认为这是最佳实践或其他任何东西,这似乎是我的项目所需要的。

    【讨论】:

      【解决方案2】:

      如果您不知道 else 子句中想要什么,您确定需要 if 吗?为什么要测试 is_ajax 呢?为什么不直接将 JSON 数据返回给浏览器?

      【讨论】:

      • 好点 :) ..但我的意思是一般性问题 - 有时它可能是合适的 - 当 javacsript 被禁用时保持前端的清洁...... - 我不总是想返回任何东西如果请求不是 ajax ...但也许我的想法很混乱..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多