質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

355閲覧

Django REST Frameworkで作成したAPI エンドポイントを使用した際のCORSポリシーによるブロックが、CORS設定してもなぜ発生するか

mkon1

総合スコア7

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/09/22 01:30

編集2023/09/22 07:44

実現したいこと

Django REST Frameworkで作成したAPIエンドポイントをReact + Typescriptで作られたアプリで使用したい。

前提

Django REST Frameworkで以前にAPIエンドポイントを作成しました。
ブラウザでAPIを表示して確認できたので、APIの作成はできていると思っています。

そのAPIを使用しようと、GithubにReact + Typescriptで作成したアプリをアップロードし、デプロイ環境であるNetlifyとVercelにデプロイしました。

発生している問題・エラーメッセージ

React + Typescriptアプリのブラウザの開発ツールでエラーメッセージを見たところ、CORSポリシーによりブロックされていますと表示されました。

該当のソースコード

CORS設定の準備

1pip install django-cors-headers

Djangoのsettings,pyの一部

1INSTALLED_APPS = ( 2 ... 3 'corsheaders', 4 ... 5) 6 7 8MIDDLEWARE = [ 9 ..., 10 'corsheaders.middleware.CorsMiddleware', 11 ..., 12] 13 14 15CORS_ALLOWED_ORIGINS = [ 16 'React + TypescriptアプリのURL', 17] 18

React+Typesriptアプリのsrcのcomponents内にあるコードの一部

1 useEffect(() => { 2 fetch("APIエンドポイントのURL") 3}

試したこと

ブラウザ開発ツールのエラーメッセージからDjango REST FrameworkのCORS設定の修正が必要だと考えました。調べたところ、設定は上記のみであると思われたためURL等の誤字を確認しましたが、ミスはありませんでした。

Pythonanywhereのサポートチームに問い合わせましたが、上記の設定に関する説明のみでその他の設定はないとのことでした。

試しに、Django REST Frameworkで作成したプロジェクト内に、同プロジェクトで作成した本APIエンドポイントを使用するアプリを作成してPythonanywhereでデプロイしました。
こちらはブラウザがアクセスし続けるだけでPythonanywhereの設定である5分後にタイムアウトしました。アクセスはできていないため、ブラウザのエラーメッセージは確認できませんでした。同プロジェクト内のAPIを使用するアプリはあまり作られないと思っています。

補足情報(FW/ツールのバージョンなど)

DjangoはPythonanywhereでデプロイしています。Python3です。

自分の予想ですが、NetlifyとVercelはフリーアカウントを使っています。
そのため、URLの最後がnetlify.appとvercel.appです。
これらはあまり一般的でないため、Django側が認識できていないのではないかと少し考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

'React + TypescriptアプリのURL'ですが、本当にURLを書いたのでしょうか?

CORS_ALLOWED_ORIGINSという名前のとおり、ここに指定すべきものはオリジン(プロトコル、FQDN、ポート番号の組)であり(例:https://teratail.com)、パスまで書いてはいけません。

投稿2023/09/22 02:26

maisumakun

総合スコア146544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkon1

2023/09/22 04:26 編集

ご回答ありがとうございます。 CORS_ALLOWED_ORIGINSに書いているものは、ブラウザでアプリが表示されるURLを書いています。 例:https://teratail.com/app1 の/app1以降に当たるものは書いていません。 ご回答への正しい返信になっているかわかりませんが、例:https://teratail.comの、.com以降の部分は書いていません。
maisumakun

2023/09/22 04:32

それなら、この問題というわけではなさそうですね。失礼いたしました。
mkon1

2023/10/01 12:45 編集

ご返信ありがとうございます。 React+Typesciptのデプロイ環境であるNetlifyとVercelを今のところ、フリーアカウントで使っています。 そのため、URLの最後がnetlify.appとvercel.appとなっているため、一般的ではない形です。 その辺りが、Djangoが不具合であると認識しているのではないかと予想しています。 ただし、Pythonanywerehのエラーログには何もエラーが表示されていません。 DRF関連の不備は表示されないのかはわかりませんが。 Pythonanywhereのサポートチームにも同じ質問をしています。 日を置いて、CORS_ALLOW_ALL_ORIGINS = Trueを試して全てのリクエストの許可をしてみました。 ですが、React側のブラウザのエラーは変わらずCORSポリシーエラーでした。 また、React側のfetch関数で”no-cors mode”を試してみました。 ”no-cors mode”の機能の通り、CORS設定は無視されるためリクエストはDRF API側に届いていますが データが空で何も受け取れないというエラーでした。これは"no-cors mode"の本来の動作のため問題ない動作でした。 このことから、このCORSポリシーエラーはDjangoからでもReactからでもないと思われます。 元々フロントエンドのReactではCORS設定自体がありません。 API機能等の動作が確認できたら有料版に切り替えてもいいかと考えていますが、動かないうちに切り替えるのもと、検討中です。 大変お忙しい中、ご連絡頂きありがとうございました。 何かしらご存知でしたら、引き続きよろしくお願い致します。
mkon1

2023/10/20 04:21 編集

後日、FlutterでこのDRFで作ったAPIを使ってみました。エミュレーターですが、iphoneとAndroidではAPIのデータが表示されましたが、macOSとChromeではCORSエラーが発生しました。ローカルサーバーのオリジンもDjangoのsettings.pyに記載済みです。 ネイティブアプリはCORS設定と関係がないので、動作に納得です。やはりブラウザなのでオリジンに関わるところのようです。ブラウザ独自のセキュリティが関係しているのかは不明です。 Djangoは普及しているのかわかりませんが、こういうところが使いづらいところなのかなと思います。 Pythonanywhereサポートチームからは、各設定は正しいがCORSエラーがブラウザで表示される理由は不明とのことでした。 改めまして、ご存じの方がおられましたら、解決済みにしていますがご教授頂けましたらと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問