【问题标题】:Configuring React Routes, Django URLs using Webpack使用 Webpack 配置 React 路由、Django URL
【发布时间】:2019-02-17 09:19:48
【问题描述】:

自学如何将 React 前端与 Django 服务器一起使用,但我很难让 React 路由正常工作。每当我重新加载页面时,它都会认为我正在向服务器发出 GET 请求。在 localhost:8000 刷新工作正常,但除了 API 路由错误之外的任何内容。

很确定问题出在我的一个 urls.py 文件中。

quiz_app/urls.py

urlpatterns = [
  path('', include('quizzes.urls')),
  path('', include('frontend.urls'))
]


frontend/urls.py

urlpatterns = [
  path('', views.index )
]


quizzes/urls.py

urlpatterns = [
  path('admin/', admin.site.urls),
  path(r'^nested_admin/', include('nested_admin.urls')),
  re_path('api/quizzes/', views.QuizList.as_view()),
  re_path('api/quizzes/<str:name>/', views.SingleQuiz.as_view()),
  re_path('api/questions/', views.QuestionList.as_view()),
  re_path('api/answers/', views.AnswerList.as_view())
]

为了更好的衡量:

frontend/views.py

def index(request):
  return render(request, 'frontend/index.html')


frontend/src/App.js

class App extends Component {
  render() {
    return (
      <Router>
        <div className="App">
          <Grid>
            <Header />
            <Route exact path="/" component={Quizzes} />
            <Route exact path="/:name" component={Quiz} />
          </Grid>
        </div>
      </Router>
    )
  }
};

重申一下,问题在于 App.js 中的 "/:name" 路由试图向 Django 服务器发出“GET”请求并出错,因为没有什么可以处理它们,而不是默认使用 React 路由。让我知道我在这里做错了什么。在将 React 与其他服务器框架一起使用时,我已经解决了这个问题,但我是 Python/Django 的新手,所以不知道从哪里开始。

【问题讨论】:

  • 什么库定义了路由器组件?通常在前端框架(如(angular,react,vue)中,路由器只处理(客户端)中的te调用并为每个路由绘制正确的组件,因此您需要一个像服务一样工作的组件,然后调用后端 API。
  • 我正在使用 react-router-dom。抱歉,如果我的问题措辞有误,但这就是我正在做的事情。服务器调用由不同的组件处理,问题在于它们都在同一个端口中。如果 API 不存在,我想要让浏览器搜索反应路线,就像你如何使用 Webpack 设置反应/节点应用程序一样。相反,它只是出错了。
  • 在我的 urls.py 文件中未指定的任何地方刷新页面之前,我都没有遇到问题。

标签: django reactjs webpack django-rest-framework


【解决方案1】:

我有一个类似的问题,但对我来说 django 管理页面没有显示。将此添加到我的前端/网址对我有用。

urlpatterns += re_path(r'^.*/$', views.index)

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,那么views.html 会呈现将运行App.js 中定义的应用程序的页面。你遇到的问题是,如果你访问一个 URL http://yourserver/my-quiz,其中my-quiz 是一个测验名称,请求将被发送到 Django 服务器,它说:404,我不知道那个 URL。

    一个可行的解决方案是向您的 Django 主应用程序添加一条包罗万象的路由:

    urlpatterns += re_path(r'.*', views.index)
    

    作为最后一条路线。这只是让 Django 为每个请求渲染您的应用程序,而 react-router 将负责路由。

    这样做的缺点是,如果页面真的不存在,您将不会收到 404(在您的情况下,没有该名称的测验)。除了复制路由配置外,我还没有找到解决方案(在您的情况下,如果存在具有该名称的测验,请检查 Django 应用程序)。

    【讨论】:

    • 谢谢,这似乎奏效了。我不必将 r 放在 ".*' 前面,但它现在仍在工作。不确定这是否是最佳实践,但我喜欢在事物的前端处理错误消息。如果没有测验,则 GET 请求将不会有任何内容,因此只需编写一些条件逻辑,在其中显示错误或“这里没有任何内容”消息而不是测验。
    • 哎呀,这行得通,但它产生了一个单独的问题。我的 GET 请求只返回一个空数组。如果我恢复使用path('', views.index),那么一切正常。奇怪的是,当我在邮递员或浏览器中测试 API 路由时一切正常,我只是没有通过前端得到任何东西。
    • 弄清楚发生了什么,服务器首先使用'.*' 路由,尽管我在我的 urls.py 中最后列出了它。所以我实际上是从我的 GET 请求中获取我的 index.html,尽管我在使用 Postman 或浏览器时获取了 JSON 数据。正在修复。
    • 您应该在 reactjs 路由器中将不需要的 url 处理为 404。查看reactrouter.com/web/example/no-match
    【解决方案3】:

    通常在前端框架(如(angular、react、vue)中,路由器仅处理(客户端)中的te调用并为每个路由绘制正确的组件,因此您需要一个像服务一样工作的组件,并且使调用后端 api。 e.j.

    utility.js

    export function get_some_route(){
        return fetch('some_route');
    }
    

    实用程序文件包含获取后端路由的函数。这样你就可以 导入此文件并获取为路由器渲染的组件中的数据。

    your_component.js

    import get_some_route from 'utility.js';
    class x extends component{
      ...
      componentDidMount(){
         get_some_route().then(response => {
             // do some thing with the data e.j
             this.setState({data: response.data});
         }
      }
      ...
      render(){
          return(/*some html with the data */);
      }
    }
    

    【讨论】:

    • 我在获取数据时没有问题,就在我刷新了我包含的 urls.py 文件中未指定的路由时。例如,如果我刷新“/api/quizzes”,我会得到 JSON 数据,但如果我刷新 /name,它会出错,因为我的 URL 中没有 /name 路由并且它不知道使用 React 路由。
    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2016-08-18
    • 2020-10-09
    • 2017-01-14
    • 2022-08-17
    • 2017-05-19
    • 2019-05-30
    • 2019-02-23
    相关资源
    最近更新 更多