使用 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 模块并在我寻找要包含的基本模式时使用它。这不是一个完美的解决方案,但可以完成工作。
上下文:
我使用 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 模块并在我寻找要包含的基本模式时使用它。这不是一个完美的解决方案,但可以完成工作。