使用 api 子目录在开发服务器上设置 Django 和 Webpack

Setting up Django and Webpack on dev server using api subdirectory

上下文:

我使用 Django 作为后端,Vue/Vuetify 作为单独的前端。我使用 Apache 为前端提供服务,而 Django 严格用于 client/server 设置中的 api 调用。

我已将 WSGIScriptAlias 设置为从 [base_url]/api 而不是站点根目录提供服务。我部署了该项目,它按预期从 /api 为 django request/repsonses 提供服务。

在我的开发环境中,我运行正在使用 2 个并发开发服务器。我正在 运行 将 webpack 开发服务器(端口 10000)用于前端项目,并将 django 运行 服务器放在一个单独的端口(10001)上以在开发时为我的请求提供服务。

在 webpack 中我设置了以下内容:

devServer:{
        hot: true,
        port: 10000
        historyApiFallback: true,    
        host: 'localhost',
        //django api
        proxy:{
            '/api': {
                target: 'http://localhost:10001',
                pathRewrite: {'^/api' : ''},
                secure: false
            }
        }
    }

这里的想法是,任何时候我从 http://localhost:10000/api 请求一些东西,它都会自动重定向到 localhost:10001,这模仿了生产实例如何工作,因为生产切断了 /api 请求的一部分。

问题:

当我 运行 开发 webpack 和 django 服务器时,我可以成功请求 localhost:10000/api 并获得 django 响应,但我注意到当我尝试访问 http://localhost:10000/api/admin, which should bring up the django admin page, Django redirects to http://localhost:10000/admin.

我正在寻找 WSGIScriptAlias 之外的方法(因为我不能在我的开发实例中使用它,除非我设置一个本地 apache / virtualhost,我在修改 django 时遇到过刷新问题)。

有没有一种方法可以执行以下操作之一?

A) 在生产中没有 WSGIScriptAlias / Django 在生产中删除请求的 /api 部分(这将使 url 模式在所有环境中保持一致)

B) 可能在 Django Settings 或 运行server 中设置一个 Base URL 来包含 /api 这样它就不会在没有 /[=57 的情况下尝试重定向=]

C) 也许我在 devserver 设置中缺少 webpack 中的某些东西?

完全披露: 还有另一个问题问一些 similar (How to set base URL in Django) 但不同的问题,因为看起来他们在谈论生产,我在谈论开发实例。他们的解决方案也是使用我无法使用的 WSGIScriptAlias。

这不是最理想的解决方案,但在 WSGIScriptAlias 的末尾添加 /api 似乎已经标准化了开发和生产之间的所有内容。为了避免必须将 'api/' 添加到我所有基本 url 模式的前面,我创建了一个围绕 Django.urls.path 和 Django.urls.re_path 的包装器,它使用 base_pattern模块内的变量:

/etc/apache2/sites_available/app.conf:

<VirtualHost *:443>
   ...
   WSGIScriptAlias /api /path/to/django/wsgi.py/api
   ...
</VirtualHost>

utils/urls.py:

from django.urls import path, re_path


base_pattern = ''

def base_path(broute,bview,bkwargs=None, bname=None):
    global base_pattern
    return path(route=base_pattern + broute, view=bview, kwargs=bkwargs, name=bname)

def re_base_path(broute,bview,bkwargs=None,bname=None):
    global base_pattern
    return re_path(route=base_pattern + broute, view=bview, kwargs=bkwargs, name=bname)

现在我只导入我的 utils.urls 模块并在我寻找要包含的基本模式时使用它。这不是一个完美的解决方案,但可以完成工作。

引用: https://serverfault.com/questions/555955/can-i-configure-apache-mod-wsgi-so-that-the-alias-url-path-is-not-stripped-befor