当前位置: 代码迷 >> python >> 与Django,webpack,reactjs,react-router解耦前端和后端
  详细解决方案

与Django,webpack,reactjs,react-router解耦前端和后端

热度:70   发布时间:2023-06-13 15:15:45.0

我试图在我的项目中将我的前端和后端分离。 我的前端由reactjs ,路由将使用react-router ,我的后端如果是Django ,我打算使用前端对Django进行API(ajax)调用。

现在我不确定如何让这两个方面正确地相互交谈。

这是我项目的

这是我的项目结构:

/cherngloong
  /app (frontend)
  /cherngloong
    /templates
      index.jtml
    urls.py
    settings.py
    ...
  /contact
    urls.py
    views.py

我用webpack建立我的所有的JS和CSS,并将其放入index.htmlwebpack_loader看起来像这样:

{% load render_bundle from webpack_loader %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Example</title>
  </head>

  <body>
    <div id="app"></div>
    {% render_bundle 'main' %}
  </body>
</html>

Django这里是我的cherngloong/urls.py

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', TemplateView.as_view(template_name='index.html')),
    url(r'^api/', include('contact.urls'))
]

urlpatterns += staticfiles_urlpatterns()

我不想从django提供我的应用程序或让django在任何网址上提供相同的视图。

这是我的react-router路由:

var routes = (
    <Router>
        <Route path="/" component={ Views.Layout } >
            <Route path="contact"  component={ Views.Contact }/>
        </Route>
        <Route path="*" component={ Views.RouteNotFound } />
    </Router>
);

export default routes;

我现在可以运行服务器但是当我运行前端部分时,我在开发人员工具中看到了这一点

http://localhost:8000/static/public/js/main.js Failed to load resource: the server responded with a status of 404 (NOT FOUND)

您的settings.py定义了以下内容:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'app'),
)

这将提供/app/目录中的文件。 所以url /static/public/js/转换为/app/public/js/目录。

你想要的是提供/public/ dir中的文件。 使用以下设置:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'public'),
)

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'js/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json')
    }
}

此外,您在此处和github中发布的代码中的URL也不同。 url(r'', Templa...将匹配所有url,即使在调用/api/时也只渲染index.html 。将此行移到底部:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/', include('contact.urls')),
]

urlpatterns += staticfiles_urlpatterns()

urlpatterns += [
    url(r'', TemplateView.as_view(template_name='index.html')),
]