django - 使用 api 子目录在开发服务器上设置 Django 和 Webpack
问题描述
语境:
我使用 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 管理页面,Django 重定向到http://localhost:10000/admin。
我正在寻找一种 WSGIScriptAlias 之外的方法(因为我不能在我的开发实例中使用它,除非我设置了一个本地 apache / virtualhost,我在修改 django 时遇到了刷新问题)。
有没有办法可以执行以下操作之一?
A)在生产中没有 WSGIScriptAlias / Django 在生产中删除请求的 /api 部分(这将使 url 模式在所有环境中保持一致)
B) 可能在 Django 设置或运行服务器中设置一个基本 URL 以包含 /api,这样它就不会在没有 /api 的情况下尝试重定向
C)也许我在开发服务器设置中缺少 webpack 中的某些内容?
完全披露: 还有另一个问题问类似的问题(如何在 Django 中设置基本 URL),但有所不同,因为看起来他们在谈论生产,我在谈论开发实例。他们的解决方案也是使用我无法使用的 WSGIScriptAlias。
解决方案
这不是最理想的解决方案,但是将 /api 添加到 WSGIScriptAlias 的末尾似乎已经标准化了开发和生产之间的一切。为了避免在所有基本 url 模式的前面添加“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>
实用程序/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 模块并在我寻找要包含的基本模式时使用它。这不是一个完美的解决方案,但可以完成工作。
推荐阅读
- windows - 使用文档中的 cro 命令行工具时遇到问题
- ionic-framework - Programmatically scroll ion-segment
- c# - How to remove part of a path and start from a certain part
- vba - “编译错误:预期:列表分隔符或)”
- reactjs - React Router: How to match indeterminate amount of sub paths of a nested route?
- python-3.x - Create dictionary from unwieldly string of keyvalues
- r - 如何在 R 中运行回归不连续性(RDiT)?
- html - 如何将包含多个图像的 div 标签居中?
- javascript - How to make an object rotate in the direction of my mouse cursor?
- python - 使用 sklearn 缩放器覆盖 dask 数据帧