web-dev-qa-db-ja.com

プリフライトリクエストではリダイレクトは許可されません

REST APIを使用しようとすると応答が得られるという問題があります。「Originから ' https://kollektivet.app:8082/api/login/ 'でフェッチするアクセス https://kollektivet.app 'はCORSポリシーによってブロックされました:プリフライトリクエストへの応答はアクセス制御チェックに合格しません:プリフライトリクエストではリダイレクトは許可されません。

フェッチしようとしたときの応答の図

これは、使用している残りのAPIのいずれかを試すと発生します。私が読んだことから、このエラーはリダイレクトしようとしていることを意味しますが、そうではありません。

バックエンドはDjangoで、次のようになります。

    @csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def register(request,):
        password = request.data.get("password", "")
        email = request.data.get("email", "")
        if not email and not password and not email:
            return Response(
                data={
                    "message": "username, password and email is required to register a user"
                },
                status=status.HTTP_400_BAD_REQUEST
            )
        new_user = User.objects.create_user(
            email=email, password=password
        )
        return Response(status=status.HTTP_201_CREATED)

そして、フロントエンドは次のように反応します:

createUser(event) {
        event.preventDefault();

        let data = {
            name: this.state.name,
            password: this.state.password,
            repeatPassword: this.state.repeatPassword,
            email: this.state.email
        };

        if (this.state.name !== '' && this.state.password !== '' && this.state.email !== '' && this.checkPasswords()) {
            console.log('name', this.state.name, 'password ', this.state.password, 'email ', this.state.email);
                fetch("https://kollektivet.app:8082/api/register/", {
                    method: 'POST',
                    headers: {
                        'Accept': 'application/json',
                        'Content-Type': 'application/json',
                    },
                    mode: "cors",
                    body: JSON.stringify(data)
                })
                    .then(response => response.json())
                    .then(data => console.log(data))
                    .catch(error => console.log(error));
            this.setState({message: "Du er nå registrert! For å aktivere din konto trykk på linken som vi har sendt til deg på epost"});
            this.setState({name: ""});
            this.setState({password: ""});
            this.setState({repeatPassword: ""});
            this.setState({email: ""});

        }
    }

これはDjango設定ファイルです:

CORS_Origin_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'Origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

これが関連する場合、Apache2でこれを実行しています。ポート8082も閉じられています。同じサーバー上にある場合、これを開く必要がありますか?

ありがとう!

6

site.site.comapi/register /にリダイレクトされています

これを行う他のミドルウェアはありますか?たぶんApacheの設定に?

これは1であるため、ブラウザはこの応答をキャッシュし、このリダイレクトの原因となったコードを移動した場合、またはDjango =実行中。

そのため、ブラウザのリダイレクトキャッシュもクリアする必要があります。

1応答が好きではない理由です。 2は、より丁寧です。

3
rich tier

Django国際化フレームワークによってリダイレクトが引き起こされ、すべてのURLが_/en/path_to_resource_などのi18n URL拡張を実際に_path_to_resource_国際化フレームワークは、302リダイレクトを通じてこれを実現します。

この問題の解決策は、rest-apiのURLをi18n_patternsのセクション外に保持することです。結果のurls.pyは次のようになります

_urlpatterns = [
    path('i18n/', include('Django.conf.urls.i18n')),
    path('rest/', include(('rest.urls', 'rest'), namespace='rest')),
]

urlpatterns += i18n_patterns(
    path('admin/', admin.site.urls),
    path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
    path('my_app/', include(('my_app.urls', 'my_app'), namespace='my_app')),
)
_
0
Nechoj