【问题标题】:How to properly decouple Django from an AJAX application?如何正确地将 Django 与 AJAX 应用程序分离?
【发布时间】:2013-09-06 05:30:44
【问题描述】:

我正在使用 TastyPie 和 Django 为将具有浏览器和移动(本机 iOS)客户端的应用程序构建后端。

我已经通过 TastyPie 和 Django 文档,可以使用我设置的 TastyPie 资源或使用内置视图的 Django 成功进行身份验证。我看到很多关于在页面上包含 CSRF 令牌并使用您的 JavaScript 抓取它的示例,这很有效,但我现在不明白要实际确定用户是否在初始页面加载(来自 JavaScript)时登录。

例子:

如果我想从一个单独的、快速的 Web 服务器提供静态 HTML,并缓存我的应用程序 JavaScript,并且只通过 TastyPie 视图与 Django 交互,我如何确定用户是否已登录(并且知道呈现登录使用 JavaScript 的表单或应用程序视图),在注销后,我需要从客户端浏览器中删除任何会话信息吗?

如果我通过 Django 的模板引擎提供 HTML,我可以通过那里适当地呈现登录表单,但如果我想真正将我的 JavaScript 应用程序与 Django 分离(并且表现得像一个移动客户端),这似乎并不理想。

编辑:我正在使用 Backbone.js,但我认为这无关紧要。

更新:

我想我再次阅读了 Django 的 CSRF 文档。

如果您的视图未呈现包含 csrf_token 模板标签的模板,则 Django 可能不会设置 CSRF 令牌 cookie。这在表单被动态添加到页面的情况下很常见。为了解决这种情况,Django 提供了一个视图装饰器来强制设置 cookie:ensure_csrf_cookie()。

如果我不想渲染 Django 模板,看起来我仍然可以使用 cookie 并将其拉入我的 Backbone 或 jQuery AJAX 方法。我不确定 TastyPie 是否确保发送 cookie 或如何绑定它。

如果我使用 AJAX 注销,cookie 会自动删除还是失效?这些 CSRF 令牌是否对每个用户会话都是唯一的?我明天必须用它测试一些东西。是否可以在 TastyPie 视图上使用 Django 装饰器?

【问题讨论】:

    标签: javascript python django client-server tastypie


    【解决方案1】:

    移动客户端并不关心 Javascript 来自 Django 还是任何其他 Web 服务器。因此,继续将所有 JavaScript 和静态 HTML 放在另一台服务器上。

    如果您希望您的移动应用程序查看用户是否已登录,它应该对您的 Django 后端(请求经过身份验证的地方)进行 AJAX 调用。返回的数据应指示会话是否处于活动状态(用户已登录)。

    另一个 AJAX 调用可以执行 Django 注销功能。

    【讨论】:

    • 这一切都说得通——只是将用户名存储在浏览器中是一种好习惯,还是有另一种方法来保持用户会话(附加到 API 响应的 cookie 等)?
    • Django 将在用户登录时存储一个带有会话 ID 的 cookie。该 cookie 将附加到 AJAX 请求以获取用户信息。你不需要做任何其他事情。
    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2018-09-18
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多