【发布时间】:2021-02-08 15:13:17
【问题描述】:
关于 Django 在 Postman 和 Chrome 中的 CSRF cookie 设置以及不同的设置,我有奇怪的行为:
情况1:
我在MIDDLEWARE 设置中设置了'django.middleware.csrf.CsrfViewMiddleware'。
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
我使用 Postman 对 REST 端点进行 POST 调用:
class BlogCreateView(APIView):
http_method_names = ['post']
def get_context_data(self, **kwargs):
return {
'request': self.request,
'kwargs': kwargs,
}
def post(self, request, **kwargs):
"""
POST a new object
"""
context = self.get_context_data(**kwargs)
serializer = self.serializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
new_instance = serializer.save()
return Response(serializer.data, status=HTTP_201_CREATED)
CSRF cookie 未设置。我也没有在请求的标头中设置 csrf 值。但服务器接受它。这不应该发生吧?
情况2:
当我在 Chrome 浏览器中直接转到 http://localhost:8000/blogs/create 时。这会向同一端点发出 GET 请求。响应是"detail": "Method \"GET\" not allowed.",这是预期的。但是cookie是在浏览器中设置的。
情况3:
我关掉CsrfViewMiddleware
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
我使用 Postman 对我的 Graphene 端点进行 POST 调用:
from graphene_django.views import GraphQLView
urlpatterns = [
path('graphql', GraphQLView.as_view(graphiql=True)),
]
现在 cookie 已在 Postman 中设置!这种情况的组合对我来说毫无意义。非常感谢您的帮助。
我的目标是最终让 csrf 保护在生产环境中发挥作用。但我想在本地测试一下。
【问题讨论】:
标签: django django-rest-framework postman csrf