Django URL模式为外部Web包包提供服务

Django URL模式为外部Web包包提供服务,django,django-rest-framework,single-page-application,Django,Django Rest Framework,Single Page Application,我正在编写一个带有react SPA前端的django rest框架API(后端)。对于生产环境,前端通过位于的nginx提供服务,后端代理到gunicorn,并从同一域以不同的路径提供服务- 这一切在生产中都可以正常工作,没有CORS问题,因为前端和后端都通过nginx在同一个域下提供服务 对于本地开发,我希望能够使用./manage.py runserver复制类似的设置,并让django从project/frontend/dist(由npm build单独构建)提供前端服务 有没有人有任何

我正在编写一个带有react SPA前端的django rest框架API(后端)。对于生产环境,前端通过位于的nginx提供服务,后端代理到gunicorn,并从同一域以不同的路径提供服务-

这一切在生产中都可以正常工作,没有CORS问题,因为前端和后端都通过nginx在同一个域下提供服务

对于本地开发,我希望能够使用./manage.py runserver复制类似的设置,并让django从project/frontend/dist(由npm build单独构建)提供前端服务

有没有人有任何urlpattern魔法可以让这种情况发生,也可以让react路由器很好地运行?我就是想不出来,它开始让我发疯

项目结构是这样的,如果它有助于任何解释的话

Project
|
 ── backend
│   ├── apps
│   ├── config
|   |    ├── settings.py
|   |    ├── settings_local.py
|   |    ├── urls.py
│   ├── manage.py
│   ├── requirements.txt
│   └── venv
├── frontend
│   ├── dist (contains the npm build webpack)
│   ├── node_modules
│   ├── package.json
│   ├── package-lock.json
│   ├── scripts
│   ├── src
│   ├── webpack.config.js
编辑#1 多亏了另一篇文章,我才能够通过将它添加到我的url.py中部分实现

if settings.DEBUG:
    from django.views.generic import RedirectView
    from django.contrib.staticfiles.views import serve

    bundle_path = os.path.abspath(os.path.join(root_dir, 'frontend', 'dist'))

    settings.STATICFILES_DIRS += (bundle_path,)

    urlpatterns += [url(r'^$', serve, kwargs={'path': 'index.html'})]
    urlpatterns += [url(r'^(?!/?static/)(?!/?media/)(?P<path>.*\..*)$',
        RedirectView.as_view(url='/static/%(path)s', permanent=False))]
if settings.DEBUG:
从django.views.generic导入重定向视图
从django.contrib.staticfiles.views导入服务
bundle_path=os.path.abspath(os.path.join(root_dir,'frontend','dist'))
settings.STATICFILES\u DIRS+=(bundle\u路径,)
urlpatterns+=[url(r'^$',serve,kwargs={'path':'index.html'}]
urlpatterns+=[url(r'^(?!/?static/)(?!/?media/)(?P.*\..*)$”,
RedirectView.as_视图(url='/static/%(path)s',permanent=False))]
我在这里遇到的唯一问题是,如果我直接转到一个JS路由器链接,django会试图解释它,但找不到路由


我现在需要的是一个全包,它将重定向到“/”,同时在URL上保留任何额外的URL路径信息。您可以使用nginx反向代理为它们提供服务。 不需要配置Django的url。 请参见此处的示例:

最终,所有的路由都能实现这一点

已将webpack dist文件夹添加到settings.STATICFILES\u DIRS 已将网页包前端路径添加到settings.TEMPLATES

在urls.py中添加了3个新的urlpatterns(基于条件,settings.DEBUG)

urlpatterns+=[
url(r'^(?!/?静态/)(?!/?媒体/)(?P.*\..*)$,
RedirectView.as_视图(url='/static/%(path)s',permanent=False)),
url(r'^$',TemplateView.as_view(template_name='dist/index.html'),name='frontend'),
url(r'^(?P.*)/$”,TemplateView.as_视图(template_name='dist/index.html'),name='frontend'),
]
第一个重定向要使用django的静态文件提供的bundle的任何assset

第二种模式将根路径/用作webpack dist文件夹中的模板


最后一部分处理所有剩余的JS路由路径,以返回到初始根视图。

这就是我试图避免的。对于这个场景来说,在本地(或docker)使用nginx似乎有点沉重。
urlpatterns += [
        url(r'^(?!/?static/)(?!/?media/)(?P<path>.*\..*)$',
        RedirectView.as_view(url='/static/%(path)s', permanent=False)),
        url(r'^$', TemplateView.as_view(template_name='dist/index.html'), name='frontend'),
        url(r'^(?P<path>.*)/$', TemplateView.as_view(template_name='dist/index.html'), name='frontend'),
]