【问题标题】:Configuring WSGI to service a single index.html file for a single page application将 WSGI 配置为为单个页面应用程序提供单个 index.html 文件
【发布时间】:2019-07-30 07:00:41
【问题描述】:

我在 Apache2 (Ubuntu 18.04) 上使用 WSGI 设置了一个标准 Django 应用程序

我现在想通过单个 index.html 文件提供所有前端内容(仍然允许访问 /admin url 并确保通过 /api 调用 REST api 工作)。我将 Ember 用于单页应用程序。

非常感谢任何帮助!

这是我当前的 .conf 设置:

DocumentRoot /var/www/examplesite.co.uk/public_html

Alias /static /home/someuser/djangoprojects/someuser_v1_project/static
<Directory /home/someuser/djangoprojects/someuser_v1_project/static>
      Require all granted
</Directory>

Alias /media /home/someuser/djangoprojects/someuser_v1_project/media
<Directory /home/someuser/djangoprojects/someuser_v1_project/media>
      Require all granted
 </Directory>

 <Directory /home/someuser/djangoprojects/someuser_v1_project/someuser_v1_project>
 <Files wsgi.py>
        Require all granted
 </Files>
 </Directory>

 WSGIDaemonProcess examplesite.co.uk python-home=/home/someuser/virtualenvs/someuser_env python-path=/home/someuser/djangoprojects/someuser_v1_project
 WSGIProcessGroup examplesite.co.uk
 WSGIScriptAlias / /home/someuser/djangoprojects/someuser_v1_project/someuser_v1_project/wsgi.py

【问题讨论】:

    标签: ember.js mod-wsgi wsgi django-wsgi


    【解决方案1】:

    由于您的 index.html 将是静态的,因此只需将其按原样发送到用户代理(浏览器)即可。它不需要任何服务器端处理 (WSGI)。

    网络服务器可以根据浏览器的请求简单地发送 index.html(和任何 js/css 资源)。它甚至不需要与您的 API 后端位于同一目录中。

    我在生产应用程序中使用这样的设置。这样可以保持前端/后端的开发和部署独立。

    /www
      /myapp                <-- ember SPA (where normal users will go)
         index.html
        /assets
        /fonts
      /myapp_backend
        /api/v1/...          <-- backend API (API that ember talks to)
        /admin/              <-- admin section
    

    您可以在 ember 配置生产设置中定义后端 API 位置。 (可能是开发中的不同设置)。然后,您可以将 ember 应用程序数据适配器中的命名空间设置为此路径。

    // config/environment.js
    ...
    APP: {
      ENV: {
             REST_API_ENDPOINT: 'myapp_backend/api/v1',
             REST_API_HOST:     'http://production-host',
           ...
           }
    
      ...
    }
    
    // app/adapters/application.js
    import DS from 'ember-data';
    import ENV from '../config/environment';
    ...
    
    export default DS.RESTAdapter.extend({
        namespace: ENV.APP.REST_API_ENDPOINT,
        host:      ENV.APP.REST_API_HOST,
        ...
    })
    

    当发布准备就绪时,您可以ember build --environment=production 并将“dist”目录复制到服务器 myapp 目录。

    【讨论】:

    • 感谢您回来。我过去使用这样的设置完成了 PHP 应用程序,但是(我不相信)这将适用于 Django,因为没有任何代码位于公共(在您的示例中为 www)目录中。我正在努力寻找一种能够使用 WSGI 提供 Django 代码的方法(显然是必须的),并且能够提供静态(Ember)index.html 文件并将所有流量重定向到该文件。对我来说,我在 github.com/metakermit/django-spa 下面提到的解决方案看起来会是最好的解决方案?
    • 如果您可以设置您的 django API 以响应来自浏览器的(授权?)请求,那么您应该能够让您的 ember 应用在​​浏览器中加载后发出相同的请求。
    • 您只想将基本 url (mysite.com) 的请求重定向到 index.html(ember 应用程序),其他请求应由 api(或您的管理代码)提供服务。我快速浏览了一下 django-spa,它似乎解决了您的用例
    • 嗨 - 这就是问题所在 - 能够使用 WSGI 提供静态 HTML 和 Django 代码。我考虑了单独的域,然后遇到了我提到的插件,这意味着我不需要担心 WSGI,这一切都在中间件中完成。不确定这是否是最好的解决方案,但似乎工作正常 - 尚未在生产中测试。
    【解决方案2】:

    最好不要使用 WSGI/ngnix 为完全解耦的前端应用程序的静态资产提供服务,而是使用 Netlify 之类的服务或使用 ember-cli-deploy http://ember-cli-deploy.com 在 AWS 上托管资产。

    为什么?

    • 更快
    • 您可以更轻松地自动部署到任一应用
    • 你不必考虑这个问题
    • Netlify 尤其提供部署预览等功能,让您的生活充满乐趣。

    如果你想要一个具体的答案,我会看看这个:https://pypi.org/project/wsgi-static-middleware/

    【讨论】:

    • 嗨 - 感谢您回来。至少最初我想使用 WSGI 从同一台服务器为应用程序提供服务。我看过几篇讨论这个问题的帖子(但正如我所说我无法开始工作),所以想先追求这个 - 希望不使用中间件就可以吗?
    • 您好,将看看 Netlify,并且还考虑将我的 Django 代码和 Ember dist 文件夹托管在同一台服务器上但在不同的域名下。 Ember 代码显然会位于“实际”域中。听起来不错,但 xml 站点地图是在 Django 中生成的——在不同的域上!这也会是 Netlify 等服务的问题吗?
    • 我现在只是从我为此目的创建的 Django 应用程序中提供一个静态 index.html 文件。尚未在生产中进行测试,但不明白为什么这不起作用,它真的很简单。还有这个插件,看起来很有趣github.com/metakermit/django-spa
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多