【问题标题】:How do I combine my react server with django server using server sided rendering?如何使用服务器端渲染将我的反应服务器与 django 服务器结合起来?
【发布时间】:2019-09-09 23:45:57
【问题描述】:

当我使用

部署我的 django 项目时

python manage.py runserver,我的反应应用与npm start

我不知道哪一个是我的“真正的项目”。我认为问题归结为客户端渲染与服务器端渲染,现在我想使用服务器端渲染,因为我对 django 比对 react 更熟悉。这意味着我必须使用 django/drf 正确设置 url 和视图?如果是这样,我的问题如下......

  1. 每当我访问一个 url(例如 website.com/items)时,我如何“调用”做出反应。我想以格式良好的 html 文件返回我所有项目的列表。我怀疑这与 path() 函数中的模板参数有关。

  2. 如何防止用户访问 api 视图 (website.com/api/items),这是我用来处理 django-rest-framework 的 api 调用的 url,但我不希望人们访问看到这个但也想对“看到”这个做出反应。

  3. 因为我正在进行服务器端渲染,除了对我的 api url 进行正确的 http 调用并使我的 html 模板看起来很漂亮之外,我的 react 应用程序还需要做什么吗?

项目网址:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('App.urls')),
    path('api/',include('App.api.urls'))
]

应用网址:

urlpatterns = [
    path('', views.index, name='index'), #nothing much here yet
]

API URL:

urlpatterns = [
    path('item',views.ListItem.as_view())
]

我的基本 React App.js 只是抓取所有项目并显示它们

class App extends Component {
    state = {
    items: []
    };
   async componentDidMount(){
    try{
    const res = await fetch('http://127.0.0.1:8000/api/item');
    const items = await res.json();
    this.setState({
        items});
    }
    catch (e){
        console.log(e);}
   }
    render(){
        return(
            <div>
                {this.state.items.map(item =>(
                    <div key={item.id}>
                        <h1>{item.item}</h1>
                        <h1>{item.price}</h1>
                         <span>{item.description}</span>
                    </div>
                ))}
             </div>
         );
        }

}
export default App;

【问题讨论】:

  • 如果你想要的是服务器端的反应渲染,那么我根本不会使用 Django,而是使用 node.js(和 KOA/Express 等)。这将使您能够充分利用服务器端渲染的优势。虽然你可以同时使用 node.js 和 Django,但是你失去了服务器端渲染给你带来的一些好处(主要是因为使用两个服务器端应用程序可能会增加渲染的延迟)。

标签: html reactjs django-rest-framework


【解决方案1】:

如果您想在服务器端渲染您的 React 应用程序,您必须在 django 应用程序的模板视图中设置您的 javascript。现在你在不同的服务器上运行你的 react 应用程序和 django 应用程序,所以这就是为什么你没有为 react 应用程序获得服务器端渲染。 这将涉及使用 webpack 或 pacel 创建反应。

我要做的是将 react 应用程序捆绑到 django 视图中,这样就是服务器端渲染。

我希望这是有道理的。

【讨论】:

  • 嗯,我明白了。我想我看到了一篇提到 webpacks 的文章。谢谢!至于我的问题的其他部分,你会不会碰巧知道如何“隐藏”api url,以免有人随机访问它?
  • 至于“隐藏”api url,你真的不能这样做。在此处查看更多详细信息:stackoverflow.com/a/29905352/8031815(问题是关于 Web 套接字,但答案也适用于常规 http 连接)。
  • 在这种情况下,Django 正在执行 SSR,它不是在服务器端渲染您的 React 应用程序,而是一些其他模板(可能是您的 React 应用程序周围的外壳)。我知道的方式是,如果你想要 React SSR,你会在后端运行 JS 以很好地......在后端渲染你的 React 应用程序,它是一个 JS 应用程序(因此是 SSR)。在浏览器中加载 SSRed 页面后,您将 ReactDOM.hydrate 那个页面,即与 SPA 相反,如果您使用 ReactDOM.render,您将“附加”到已经 SSRed 页面(甚至附加侦听器等)它)。
猜你喜欢
  • 2017-01-14
  • 2020-04-19
  • 2019-02-09
  • 2018-10-02
  • 1970-01-01
  • 2015-05-09
  • 2018-02-16
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多