mil*_*lan 14 javascript python django reactjs react-router
我使用reactjs作为前端,django作为后端.React路由器用于路由.当我刷新反应路由器路由的页面时,我得到django 404 Page Not Found error.如果我刷新主页,我不会得到任何这样的错误,因为主页也是由django模板使用其url呈现.
我必须在webpack中配置它吗?我的项目结构是我已经分离了django和reactjs.我创建了一个文件夹作为reactjs文件所在的前端.
UPDATE
主页模板包含addrestaurant等路线的所有链接.
我的webpack.config文件
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: './'
}
};
Run Code Online (Sandbox Code Playgroud)
urls.py
urlpatterns = [
url(r'^', views.home, name="homePage"),
url(r'^(?:.*)/?$', views.home),
]
Run Code Online (Sandbox Code Playgroud)
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 %}
Run Code Online (Sandbox Code Playgroud)
index.js
window.app = {
showHomePage: function(id,data){
render(
<Provider store={createStoreWithMiddleware(reducers)}>
<Router>
<App />
</Router>
</Provider>, document.querySelector(id)
);
},
}
Run Code Online (Sandbox Code Playgroud)
Banner是App组件的子组件
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;
Run Code Online (Sandbox Code Playgroud)
Pau*_*l S 16
问题可能是您没有配置URL来处理React Router中定义的路由.在您的Django中,urls.py您应该使用catch all来匹配索引模板的所有URL
urlpatterns += [
# match the root
url(r'^$', base_view),
# match all other pages
url(r'^(?:.*)/?$', base_view),
]
Run Code Online (Sandbox Code Playgroud)
这base_view将是一个视图功能,呈现包含您的捆绑应用程序的模板.
如果有人想知道,我遇到了确切的问题,而 Paul S 的回答解决了它。添加答案而不是评论只是因为 SO 不允许我在评论中格式化代码片段。我结束了使用Django的新的混合物path()和老urls()在我的urls.py:
urlpatterns = [
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view()),
path('/', login_required(TemplateView.as_view(template_name="app.html"),
login_url='login')),
url(r'^(?:.*)/?$', login_required(TemplateView.as_view(template_name="app.html"),
login_url='login')),
]
Run Code Online (Sandbox Code Playgroud)
Django 处理登录、注销和 root /。React 路由器处理其他一切
小智 6
如果有人遇到同样的问题,在django 2.0中,请按照“凯文·马丁·何塞(Kevin Martin Jose)”的回答,但应将URL替换为re_path
from django.urls import path, re_path
urlpatterns = [
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view()),
path('/', login_required(TemplateView.as_view(template_name="app.html"),
login_url='login')),
re_path(r'^(?:.*)/?$', login_required(TemplateView.as_view(template_name="app.html"),
login_url='login')),
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6733 次 |
| 最近记录: |