DjangoとReactJSを連携させる方法は?


138

Djangoの新機能であり、ReactJSの新機能です。私はAngularJSとReactJSを調査してきましたが、ReactJSに決定しました。AngularJSが市場シェアを拡大​​しているにもかかわらず、AngularJSが人気を博しているようであり、ReactJSの方がピックアップが早いと言われています。

ジャンクを別にして、私はUdemyのコースを受講し始めました。いくつかのビデオの後、それがDjangoとどの程度うまく統合されているかを確認することが重要に思われました。それは必然的に立ち上がって実行しているだけで壁にぶつかったとき、私は数時間と夜の間私のホイールを回転させないように、どのような種類のドキュメントがそこにあるのですか?

pip私が出会った包括的なチュートリアルやパッケージは本当にありません。私が遭遇したいくつかは、pyreactたとえば、機能しなかったり、日付が付けられていました。

私が持っていたのは、ReactJSを完全に分離して扱うことだけでしたが、ReactJSコンポーネントをレンダリングするクラスとIDを考慮に入れました。別々のReactJSコンポーネントが単一のES5ファイルにコンパイルされたら、その単一のファイルをDjangoにインポートします。テンプレート。

Django Rest Frameworkが関係しているように聞こえますが、Djangoモデルからレンダリングすると、すぐに機能が停止すると思います。Reduxがこのすべてにどのように影響するかを確認するのに十分ではありません。

とにかく、誰もが共有したいDjangoとReactJSを使用している明確な方法がありますか?

とにかく、ドキュメントとチュートリアルはAngularJSとDjangoにとって豊富であるため、そのルートに進んでフロントエンドフレームワークを使い始めるのは魅力的です...最高の理由ではありません。


2
私は同様の好奇心を持っていて、react + webpack + djangoのサンプルアプリをセットアップしました-リポジトリは、役に立つかもしれないいくつかの関連ツールや記事にもリンクしています。
danwild

回答:


142

私はDjangoの経験はありませんが、フロントエンドからバックエンドまで、およびフロントエンドフレームワークからフレームワークまでの概念は同じです。

  1. ReactはDjango REST APIを使用します。フロントエンドとバックエンドはまったく接続されていません。Reactは、データをフェッチして設定するために、REST APIにHTTPリクエストを送信します。
  2. Reactは、Webpack(モジュールバンドラー)とBabel(トランスパイラー)の助けを借りて、Javascriptをバンドルし、エントリーHTMLページに配置される単一または複数のファイルにトランスパイルします。Webpack、Babel、Javascript、React and Redux(状態コンテナー)について学びます。私は信じていますが、Djangoのテンプレートを使用する代わりに、フロントエンドをレンダリングするように反応することはできません。
  3. このページがレンダリングされると、ReactはAPIを使用してデータをフェッチし、Reactでレンダリングできるようにします。ここでは、HTTPリクエスト、Javascript(ES6)、Promise、ミドルウェア、Reactの理解が不可欠です。

以下は、(クイックGoogle検索に基づいて)役立つはずのWeb上のいくつかの項目です。

これがあなたを正しい方向に導くことを願っています!幸運を!うまくいけば、Djangoを専門とする他の人が私の応答に追加できることを願っています。


YouTubeチュートリアルをチェックします。以前にこれらのチュートリアルの両方を実行しました。厳密にフォローしましたが、1条は機能しませんでした。(ほとんどのコードをコピーして貼り付けました)。それは既存のプロジェクトですが、新しいプロジェクトを試してみます。記事2は非推奨のパッケージを使用しており、最近更新されていません。とにかく、AngularJSとDjangoについてもっと読むと、Django REST APIがまだ使用されているようです。その次元を追加せずに解決策を探していたと思いますが、それは避けられないようです。
eox.dev 2017年

わかりました。古い記事を削除して、回答を少し更新しました。2年以上経過しているため、削除する必要があります。番号付きの箇条書きは役に立ちますか?何が理解できませんか?
KA01 2017年

1
既存のプロジェクトと新しいプロジェクトで2つ目のリンクをさらに数回試した後、少なくとも話してもらいました。行{% render_bundle 'main' %}が間違っているとする必要があります{% render_bundle "main" %}
eox.dev 2017年

1
2番目のリンクが機能していません。リンクを更新してください。
Aditya Mishra

1
私は、私はこれを続いワット/この記事その死んだ第二のリンクを交換するだろうし、それは主に動作します。.. medium.com/labcodes/configuring-django-with-react-4c599d1eae63
ダグ・F

36

私もDjangoとReact.jsの連携を開始しているので、あなたの痛みを感じます。いくつかのDjangoプロジェクトを行いました。私は、React.jsはDjangoに最適です。しかし、始めるのは怖いかもしれません。私たちはここで巨人の肩の上に立っています;)

これが私の考えです、すべてが一緒に機能します(全体像、私が間違っている場合は誰かが私を修正してください)。

  • Djangoとそのデータベース(私はPostgresを好む)(片側(バックエンド))
  • 外の世界へのインターフェースを提供するDjango Restフレームワーク(つまり、モバイルアプリやReactなど)
  • 反対側(フロントエンド)のReactjs、Nodejs、Webpack、Redux(または多分MobX?)

Djangoと「フロントエンド」の間の通信は、Restフレームワークを介して行われます。Restフレームワークの承認と許可を適切に取得していることを確認してください。

私はまさにこのシナリオに適したボイラーテンプレートを見つけましたが、そのまま使用できます。readme https://github.com/scottwoodall/django-react-templateを実行するだけで、作業が完了すると、非常に優れたDjango Reactjsプロジェクトが実行されます。これは決して本番環境を意図したものではなく、むしろ、物事がどのように接続され、機能しているかを掘り下げて確認するための方法としてです。

私が提案したい小さな変更の1つは次のとおりです。2番目のステップに進む前に、セットアップ手順に従ってバックエンドをセットアップします(Django here https://github.com/scottwoodall/django-react-template/blob/master /backend/README.md)、セットアップの要件ファイルを変更します。

/backend/requirements/common.pipにあるプロジェクトのファイルを見つけます。コンテンツをこれで置き換えます

appdirs==1.4.0
Django==1.10.5
django-autofixture==0.12.0
django-extensions==1.6.1
django-filter==1.0.1
djangorestframework==3.5.3
psycopg2==2.6.1

これにより、DjangoとそのRestフレームワークの最新の安定バージョンが得られます。

お役に立てば幸いです。


4
1年後、私はVUE.js(vuejs.org)に切り替えました。私はそれをDjangoテンプレートで動作させ、Django Rest Frameworkを介してデータベースと通信します。速くて軽い(〜20kb)
イモリエイター

17

他の人が答えたように、新しいプロジェクトを作成する場合は、フロントエンドとバックエンドを分離し、django RESTプラグインを使用して、フロントエンドアプリケーションのREST APIを作成できます。これは理想的な世界です。

djangoテンプレート化が既に設定されているプロジェクトがある場合は、アプリケーションをロードするページに、反応domレンダリングをロードする必要があります。私の場合、私はすでにdjango-pipelineを持っていて、browserify拡張機能を追加しました。(https://github.com/j0hnsmith/django-pipeline-browserify

例のように、django-pipelineを使用してアプリをロードしました。

PIPELINE = {
    # ...
    'javascript':{
        'browserify': {
            'source_filenames' : (
                'js/entry-point.browserify.js',
            ),
            'output_filename': 'js/entry-point.js',
        },
    }
}

entry-point.browserify.js」は、テンプレートに反応アプリをロードするES6ファイルにすることができます。

import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/app.js';
import "babel-polyfill";

import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import promise from 'redux-promise';
import reducers from './reducers/index.js';

const createStoreWithMiddleware = applyMiddleware(
  promise
)(createStore);

ReactDOM.render(
  <Provider store={createStoreWithMiddleware(reducers)}>
    <App/>
  </Provider>
  , document.getElementById('my-react-app')
);

djangoテンプレートで、アプリを簡単にロードできるようになりました。

{% load pipeline %}

{% comment %} 
`browserify` is a PIPELINE key setup in the settings for django 
 pipeline. See the example above
{% endcomment %}

{% javascript 'browserify' %}

{% comment %} 
the app will be loaded here thanks to the entry point you created 
in PIPELINE settings. The key is the `entry-point.browserify.js` 
responsable to inject with ReactDOM.render() you react app in the div 
below
{% endcomment %}
<div id="my-react-app"></div>

django-pipelineを使用する利点は、静的要素がの間に処理されることcollectstaticです。


10

最初のアプローチは、DjangoアプリとReactアプリを個別に構築することです。Djangoは、Django RESTフレームワークを使用して構築されたAPIの提供を担当し、Reactは、AxiosクライアントまたはブラウザーのフェッチAPIを使用してこれらのAPIを使用します。開発用と本番用の2つのサーバーが必要です。1つはDjango(REST API)用で、もう1つはReact(静的ファイルを提供するため)用です。

2番目のアプローチは、フロントエンドアプリとバックエンドアプリが結合される点で異なります。基本的に、Djangoを使用して、Reactフロントエンドを提供し、REST APIを公開します。したがって、ReactとWebpackをDjangoと統合する必要があります。これらは、そのために実行できる手順です

最初にDjangoプロジェクトを生成し、次にこのプロジェクトディレクトリ内でReact CLIを使用してReactアプリケーションを生成します

Djangoプロジェクトの場合、pipを使用してdjango-webpack-loaderをインストール します。

pip install django-webpack-loader

次に、インストールしたアプリにアプリをsettings.py追加し、次のオブジェクトを追加して構成します

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

次に、Reactアプリケーションのマウントに使用され、Djangoによって提供されるDjangoテンプレートを追加します

{ % load render_bundle from webpack_loader % }

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Django + React </title>
  </head>
  <body>
    <div id="root">
     This is where React will be mounted
    </div>
    { % render_bundle 'main' % }
  </body>
</html>

次に、urls.pyこのテンプレートを提供するURLを追加します

from django.conf.urls import url
from django.contrib import admin
from django.views.generic import TemplateView

urlpatterns = [

    url(r'^', TemplateView.as_view(template_name="main.html")),

]

この時点でDjangoサーバーとReactサーバーの両方を起動すると、Django webpack-stats.jsonが存在しないというエラーメッセージが表示されます。したがって、次に、Reactアプリケーションで統計ファイルを生成できるようにする必要があります。

Reactアプリ内を移動してインストールします webpack-bundle-tracker

npm install webpack-bundle-tracker --save

次に、Webpack構成をイジェクトし、次に移動してconfig/webpack.config.dev.js追加します

var BundleTracker  = require('webpack-bundle-tracker');
//...

module.exports = {

    plugins: [
          new BundleTracker({path: "../", filename: 'webpack-stats.json'}),
    ]
}

これにより、BundleTrackerプラグインがWebpackに追加さwebpack-stats.jsonれ、親フォルダーで生成するように指示されます。

config/webpack.config.prod.js本番環境でも同じようにしてください。

これで、Reactサーバーを再実行すると、Reactサーバーwebpack-stats.jsonが生成され、Djangoはそれを消費して、React開発サーバーによって生成されたWebpackバンドルに関する情報を見つけることができます。

他にもいくつかあります。詳細については、このチュートリアルをご覧ください。


結合アプローチで実行するwebpack-dev-serverが必要ですか?チュートリアルでは彼がそれを実行しているからです。私の理解では、djangoはバンドルを最新の状態に保つために使用するため、実行する必要があります。これは正解?それが本番環境でどのように機能するか、つまり2台のサーバーが必要ですか?
pavlee 2018年

1
開発では、Django開発サーバーとReact / Webpack開発サーバーの両方を実行する必要があります。本番npm run build
環境で

説明をありがとう。
pavlee 2018年

最初のアプローチについて詳しく説明できますか?私が理解していることから、それには、expressReact静的JSファイルを提供するサーバーが実行されており、JSファイルはDjangoサーバーからデータをフェッチするためにajaxリクエストを実行します。ブラウザは最初にexpressサーバーにアクセスしますが、Djangoについては何も知りません。私は正しいですか?このアプローチでサーバーサイドレンダリングのようなことはできますか?
yadav_vi

静的ファイルには静的ホストとCDNを使用するだけです。たとえば、GitHub Pagesを使用して、ReactアプリケーションとCloudFlareをCDNとしてホストできます。サーバー側のレンダリングには、Expressサーバーを使用するような別の設定が必要ですが、Netlifyのようなサーバー側のレンダリングを提供する静的ホスティングサービスもあります。
Ahmed Bouchefra

10

バックエンドまたはDjangoベースの役割から来てReactJSを操作しようとしている人への注意:最初の試行でReactJS環境を正常にセットアップする人はいません:)

Owais Loneのブログがhttp://owaislone.org/blog/webpack-plus-reactjs-and-django/から入手できます。ただし、Webpack構成の構文は時代遅れです。

ブログに記載されている手順に従って、webpack構成ファイルを以下の内容に置き換えることをお勧めします。ただし、DjangoとReactの両方を初めて使用する場合は、学習曲線のため、一度に1つずつ噛んでください。

var path = require('path');
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');

module.exports = {
    context: __dirname,
    entry: './static/assets/js/index',
    output: {
        path: path.resolve('./static/assets/bundles/'),
        filename: '[name]-[hash].js'
    },
    plugins: [
        new BundleTracker({filename: './webpack-stats.json'})
    ],

 module: {
    loaders: [
      {
        test: /\.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['es2015', 'react']
        }
      }
    ]
  },


  resolve: {
        modules: ['node_modules', 'bower_components'],
        extensions: ['.js', '.jsx']
    }
};

最初のメモは本当に心強いです!
Mohammed Shareef C

7

受け入れられた答えは、DjangoバックエンドとReactフロントエンドの分離が、何があっても正しい方法であると私に信じさせました。実際、ReactとDjangoを組み合わせたアプローチがあり、特定の状況に適しています。

このチュートリアルはこれをよく説明しています。特に:

次のパターンが表示されます(ほとんどすべてのWebフレームワークに共通です)。

-独自の「フロントエンド」Djangoアプリで反応する:単一のHTMLテンプレートをロードして、Reactがフロントエンドを管理するようにします(難易度:中)

-スタンドアロンのAPIとしてのDjango REST +スタンドアロンのSPAとしての反応(難易度:難しい、認証にJWTが必要)

-Mix and match:Djangoテンプレート内のmini Reactアプリ(難易度:シンプル)



1

私はこれが数年遅れていることを知っていますが、この旅の次の人のためにそこに出しています。

GraphQLは、DjangoRESTFrameworkに比べて便利で簡単です。また、得られるレスポンスの点でも柔軟性があります。あなたはあなたが求めるものを手に入れ、あなたが望むものを得るために応答をフィルタリングする必要はありません。

サーバー側でGraphene Djangoを使用し、React + Apollo / Relayを使用できます。これは問題ではないので、調査することができます。


グラフェンとリアクト+アポロは優れたスタックです!DRFよりも少し多くのPythonを記述しますが、特にApolloがreduxの必要性をなくすため、JSコードが大幅に削減されます。
John Ottenlips
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.