首页 > 解决方案 > 使用 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。

标签: djangowebpackdjango-urlswebpack-dev-server

解决方案


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

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


推荐阅读