如何正确地将Django与AJAX应用程序分离?

时间:2013-09-06 05:30:45

标签: javascript python django client-server tastypie

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

我已经浏览过TastyPie和Django文档,可以使用我设置的TastyPie资源或使用内置视图的Djangos成功进行身份验证。我看到很多关于在页面上包含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装饰器?

1 个答案:

答案 0 :(得分:1)

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

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

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