Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一域的Heroku上提供Django API,在Amazon S3上提供单页应用程序_Django_Heroku_Amazon S3_Single Page Application_Static Files - Fatal编程技术网

在同一域的Heroku上提供Django API,在Amazon S3上提供单页应用程序

在同一域的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

我想建立一个web应用程序,其中前端(静态)和后端(API)是完全分离的,除了共享同一个域之外。通常我认为这是没有问题的,但我有一些特殊的要求:

  • API在Heroku上运行(使用Django和TastyPie)
  • 所有静态内容(包括html文件)将托管在亚马逊S3上
前端应用程序将是一个单页Javascript应用程序(带有一个基本模板,让我们称之为
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可以将
    静态
    文件夹代理到
    您的api.herokuapp.com
    ,但这首先会破坏使用PaaS的目的
  • 并将
    api
    文件夹重定向到
    您的api.herokuapp.com
    ,但仅使用301重定向无法解决CORS问题。如果你好奇,就试试看:

    <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请求。谢谢回复。到目前为止,我的方法已经有所改变,我不需要再应用上面的方法了。