反应路由和 django url 冲突 [英] react routing and django url conflict

查看:31
本文介绍了反应路由和 django url 冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 reactjs 作为前端,django 作为后端.React 路由器用于路由.当我刷新由反应路由器路由的页面时,我收到 django 404 Page Not Found 错误.如果我刷新主页,我不会收到任何此类错误,因为主页也是由 django 模板使用其 url 呈现的.

我必须在 webpack 中配置它吗?我的项目结构是我将 django 和 reactjs 分开.我创建了一个文件夹作为 reactjs 文件所在的前端.

更新

主页模板包含诸如 addrestaurant 之类的路线的所有链接.

我的 webpack.config 文件

const path = require("path");如果(!process.env.NODE_ENV){process.env.NODE_ENV = '开发';}模块.出口 = {入口: ['./src/index.js'],输出: {路径:path.join("../app/static/build/", "js"),文件名:app.js",公共路径:../app/static/build/"},devtoo: '源地图',调试:真的,模块: {装载机:[{排除:/node_modules/,装载机:'巴别塔',询问: {预设:['react'、'es2015'、'stage-1']}},{test:/.(jpe?g|png|gif|svg)$/i, loader: "url-loader?name=images/[name].[ext]"},]},解决: {扩展名:['', '.js', '.jsx']},开发服务器:{historyApiFallback: 真,内容库:'./'}};

urls.py

urlpatterns = [url(r'^', views.home, name="homePage"),url(r'^(?:.*)/?$', views.home),]

home.html

{% 扩展 'base.html' %}{% 块标题 %} 美食家 |首页{% endblock title%}{% 块内容 %}<div class="主页">

{% 结束块 %}{% 块 js %}{{ block.super }}<script type="text/javascript">变量数据 = {isUserAuthenticated:{% if request.user.is_authenticated %}true{% else %}false{% endif %}};console.log('数据',数据);$(函数(){app.showHomePage(".homepage",data);});{% 结束块 %}

index.js

window.app = {显示主页:功能(ID,数据){使成为(<Provider store={createStoreWithMiddleware(reducers)}><路由器><应用程序/></路由器></Provider>, document.querySelector(id));},}

Banner 是 App 组件的子组件

const Banner = (props) =>(<div className="navbar-container"><div className="ui 容器"><div className="ui 大二级菜单"><a className="toc item"><i className="侧边栏图标"></i></a><div className="项目标志"><div className="ui logo shape"><div className="sides"><div className="active ui side">美食家

<Link to="/restaurant" className="活动项目标签">首页</Link><Link to='/addrestaurant' className='item tab'>添加餐厅</Link><Link to="/products" className="item tab">Products</Link><div className="正确的项目"><a href="" id="bookingInfoButton" className="ui 白色倒置按钮">Booking</a>

);导出默认横幅;

解决方案

问题可能是您尚未配置 URL 来处理 React Router 中定义的路由.在您的 Django urls.py 中,您应该使用 catch all 将所有 URL 匹配到您的索引模板

urlpatterns += [#匹配根url(r'^$', base_view),# 匹配所有其他页面url(r'^(?:.*)/?$', base_view),]

base_view 将是一个视图函数,用于呈现包含捆绑应用程序的模板.

I am using reactjs as a frontend and django as backend. React router is used for routing. When i refresh the page that has routed by react router, i get django 404 Page Not Found error. If i refresh the homepage, i dont get any such error because the homepage is rendered by django template too using its url.

Do i have to configure that in the webpack? My project structure is i have seperated django and reactjs. I have created a folder as frontend where reactjs file resides.

UPDATE

homepage template has all the link for routes like addrestaurant.

my webpack.config file

const path = require("path");
if(!process.env.NODE_ENV) {
    process.env.NODE_ENV = 'development';
}

module.exports = {
  entry: [
    './src/index.js'
  ],
  output: {
    path: path.join("../app/static/build/", "js"),
    filename: "app.js",
    publicPath: "../app/static/build/"
  },
  devtoo: 'source-map',
  debug: true,
  module: {
    loaders: [{
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['react', 'es2015', 'stage-1']
      }
    },
    {test: /.(jpe?g|png|gif|svg)$/i, loader: "url-loader?name=images/[name].[ext]"},
    ]
  },
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  devServer: {
    historyApiFallback: true,
    contentBase: './'
  }
};

urls.py

urlpatterns = [
    url(r'^', views.home, name="homePage"),
    url(r'^(?:.*)/?$', views.home),
]

home.html

{% extends 'base.html' %}

{% block title %} Foodie | Homepage {% endblock title%}

{% block content %}
  <div class="homepage">
  </div>
{% endblock %}

{% block js %}
  {{ block.super }}
  <script type="text/javascript">
  var data = {
         isUserAuthenticated:{% if request.user.is_authenticated %}true{% else %}false{% endif %}
    };
    console.log('data',data);
    $(function() {
      app.showHomePage(".homepage",data);
    });
  </script>
{% endblock %}

index.js

window.app = {
      showHomePage: function(id,data){
          render(
            <Provider store={createStoreWithMiddleware(reducers)}>
                <Router>
                 <App />
                </Router>
            </Provider>, document.querySelector(id)
          );
      },
}

Banner is a child component of App component

const Banner = (props) => (
   <div className="navbar-container">
        <div className="ui container">
            <div className="ui large secondary menu">
                <a className="toc item">
                    <i className="sidebar icon"></i>
                </a>
                <div className="item logo">
                    <div className="ui logo shape">
                        <div className="sides">
                            <div className="active ui side">
                                Foodie
                            </div>
                        </div>
                    </div>
                </div>
                <Link to="/restaurant" className="active item tab">Home</Link>
                <Link to='/addrestaurant' className='item tab'>Add Restaurant</Link>
                <Link to="/products" className="item tab">Products</Link>
                <div className="right item">
                    <a href="" id="bookingInfoButton" className="ui white inverted button">Booking</a>
                </div>
            </div>
        </div>
      </div>
);

export default Banner;

解决方案

The issue is probably that you haven't configured your URLs to handle the routes that are defined in React Router. In your Django urls.py you should be using a catch all to match all URLs to your index template

urlpatterns += [
    # match the root
    url(r'^$', base_view),
    # match all other pages
    url(r'^(?:.*)/?$', base_view),
]

The base_view would be a view function that renders a template which includes your bundled app.

这篇关于反应路由和 django url 冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆