上下文:
我使用Django作为后端,使用Vue / Vuetify作为单独的前端。我使用Apache服务前端,而Django仅用于客户端/服务器设置中的api调用。
我已经设置了WSGIScriptAlias来通过[base_url] / api而不是网站根目录进行服务。我部署了该项目,并且按预期从/ api提供了Django请求/响应。
在我的开发环境中,我正在运行2个并发开发服务器。我正在为前端项目运行webpack开发服务器(端口10000),在单独的端口(10001)上运行django runserver,以在开发时为我的请求提供服务。
在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部分。>
问题:
当我运行dev webpack和django服务器时,我可以成功请求localhost:10000 / api并获得django响应,但是我注意到当我尝试访问http://localhost:10000/api/admin时,应该调出django admin页面,Django重定向到http://localhost:10000/admin。
我正在寻找WSGIScriptAlias以外的方法(因为除非在我设置了一个本地apache / virtualhost,否则我无法在我的dev实例中使用该方法,否则在修改django时会遇到刷新问题)。>
有什么办法可以做以下其中一项?
A)生产环境中没有WSGIScriptAlias / Django生产环境中删除请求的/ api部分(这将使url模式在所有环境中保持一致)
B)可能会在Django设置或运行服务器中将基本URL设置为包含/ api,以便在没有/ api的情况下不会尝试重定向
C)也许是webpack中我在devserver设置中缺少的东西?
全面披露: 还有一个问题要问类似的问题(How to set base URL in Django),但又有所不同,因为看起来好像他们在谈论生产,我在谈论开发实例。他们的解决方案还使用了我无法使用的WSGIScriptAlias。
答案 0 :(得分:0)
这不是最理想的解决方案,但是在WSGIScriptAlias末尾添加/ api似乎已经标准化了开发人员和生产人员之间的所有内容。为了避免在所有基本网址格式的前面添加“ api /”,我围绕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模块,并在寻找要包含的基本模式时使用它。这不是一个完美的解决方案,但可以完成工作。