我将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'),
]
我使用TokenAuthentication
和SessionAuthentication
:
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
)。
很抱歉提出不限成员名额的问题,但我的智慧到此为止。我真的不知道为什么它不起作用。
答案 0 :(得分:0)
由于使用的是基于令牌的HTTP身份验证方案,因此不需要SessionAuthentication
类。这应该可以解决问题:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
)
}
希望这会有所帮助。