Django和React被禁止使用403

时间:2018-12-23 03:44:41

标签: python django django-rest-framework create-react-app

我将create-react-app与Django Rest Framework结合使用来制作一个小型网站。当我使用npm start并从一个端口访问另一个端口时,一切工作正常。但是,当我npm build静态反应文件并从Django应用程序中提供它们时,遇到多个端点时会得到403 forbidden。我认为这与CSRF有关,但我不知道是什么。

我从views.py提供静态文件:

@api_view(['GET'])
def serve_html(request):
    try:
        with open(os.path.join(REACT_APP_DIR, 'build', 'index.html')) as f:
            return HttpResponse(f.read())
    except FileNotFoundError:
        return HttpResponse(
            """
            This URL is only used when you have built the production
            version of the app. Visit http://localhost:3000/ instead, or
            run `yarn run build` to test the production version.
            """,
            status=501,
        )

我的urls.py在底部包含静态文件的全部内容:

urlpatterns = [
    # ..all api paths
    url(r'^', serve_html, name='serve_html'),
]

我使用TokenAuthenticationSessionAuthentication

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

并且要求用户登录的api请求具有以下修饰符:

@authentication_classes((SessionAuthentication, TokenAuthentication))
@permission_classes((IsAuthenticated,))

附录:我注意到跨源运行它时,没有sessionid cookie(并且可以正常工作),但是当我尝试在相同源上托管react文件时,有一个sessionid cookie(并返回403 Forbidden)。

很抱歉提出不限成员名额的问题,但我的智慧到此为止。我真的不知道为什么它不起作用。

1 个答案:

答案 0 :(得分:0)

由于使用的是基于令牌的HTTP身份验证方案,因此不需要SessionAuthentication类。这应该可以解决问题:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    )
}

希望这会有所帮助。