在同一域的Heroku上提供Django API,在Amazon S3上提供单页应用程序
我想建立一个web应用程序,其中前端(静态)和后端(API)是完全分离的,除了共享同一个域之外。通常我认为这是没有问题的,但我有一些特殊的要求:在同一域的Heroku上提供Django API,在Amazon S3上提供单页应用程序,django,heroku,amazon-s3,single-page-application,static-files,Django,Heroku,Amazon S3,Single Page Application,Static Files,我想建立一个web应用程序,其中前端(静态)和后端(API)是完全分离的,除了共享同一个域之外。通常我认为这是没有问题的,但我有一些特殊的要求: API在Heroku上运行(使用Django和TastyPie) 所有静态内容(包括html文件)将托管在亚马逊S3上 前端应用程序将是一个单页Javascript应用程序(带有一个基本模板,让我们称之为index.html),并通过AJAX从API填充内容。因为我还不想为API实现CORS,并且希望遵循相同的源策略,所以我希望API和S3(buc
- API在Heroku上运行(使用Django和TastyPie)
- 所有静态内容(包括html文件)将托管在亚马逊S3上
index.html
),并通过AJAX从API填充内容。因为我还不想为API实现CORS,并且希望遵循相同的源策略,所以我希望API和S3(bucket)上的文件以某种方式共享同一个域。我也不想使用Django的flatpages应用程序或通过Django呈现index.html
我扫描了Google和stackoverflow,但到目前为止还没有找到合适的解决方案。据我所知,这种天真的方式(以某种方式将域指向Heroku应用程序和S3 bucket)是不可能的。我想到了一些解决方案,但没有找到以下来源:
- 如果可能,将域名指向Heroku和S3 bucket上的API
- 将一些选项传递给Heroku以呈现托管在S3上的html(ProcFile?),使用Django和S3库获取其他静态资产
- 也许用boto做点什么来达到这个目的
- 其他完全不同的建议
一个补充:稍后我想使用lile PhantomJS使单页应用程序可爬行。爬虫程序的此输出最好也托管在S3存储中。这在当前堆栈中是不可能的 Heroku应用程序和S3存储桶实际上是通过两个不同的域提供服务的。拥有两个不同域的好处是,您可以从所有静态资产请求中卸载服务器 要实现您想要的功能,一种复杂的方法是通过一个唯一的域适当地代理请求。幸运的是,Heroku和Amazon都不会让你这么做:
- Nginx可以将
文件夹代理到静态
,但这首先会破坏使用PaaS的目的您的api.herokuapp.com
- 并将
文件夹重定向到api
,但仅使用301重定向无法解决CORS问题。如果你好奇,就试试看:您的api.herokuapp.com
<RoutingRules> <RoutingRule> <Condition> <KeyPrefixEquals>api/</KeyPrefixEquals> </Condition> <Redirect> <HostName>your-api.herokuapp.com</HostName> </Redirect> </RoutingRule> </RoutingRules>
原料药/ your-api.herokuapp.com
在这一点上,简单的解决方案是实施 子域呢?bucket.domain.tld->您的S3 bucket。domain.tld->Heroku。或者这违反了同源政策?恐怕同源政策也适用于子域。我想我现在正在考虑使用某种CORS实现。你可以在很多方面使用JSONP。在过去,我已经能够将它用于跨域。谢谢,但是JSONP也不是一个真正可行的选择。它有一些安全问题,只支持GET请求。谢谢回复。到目前为止,我的方法已经有所改变,我不需要再应用上面的方法了。