[英]Django: "Forbidden (403) CSRF verification failed. Request aborted." in Docker Production
每当我尝试登录 Django 管理员或尝试在我的 Django 应用程序中注册时,我都会收到此错误。
我在 Docker 和http
服务站点中使用生产。 不管我知道什么,这个问题的出现是因为它通过http
而不是https
。
这是我的生产设置.py:
SECURE_HSTS_SECONDS = 518400
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool('DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS', default=True)
SECURE_CONTENT_TYPE_NOSNIFF = env.bool('DJANGO_SECURE_CONTENT_TYPE_NOSNIFF', default=True)
# SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SECURE_SSL_REDIRECT = env.bool('DJANGO_SECURE_SSL_REDIRECT', default=False)
CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'DENY'
我知道我必须对此设置进行一些更改才能使其正常工作,但我不知道是哪一个。
试试这个问题的答案:
您需要在表单中添加{%csrf_token%}
https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/
像那样 :
<form>
{% csrf_token %}
<anything_else>
</form>
另外,每次使用render_to_response时,都必须使用RequestContext(request):
return render_to_response("login.html",
{"registration_id":registration_id},
context_instance=RequestContext(request))
而且您必须导入身份验证并登录:
from django.contrib.auth import authenticate, login
检查您的错误消息是否包含如下行:
Origin checking failed - http://my.web.site.com does not match any trusted origins.
如果是这种情况,您的问题可能是您在 Docker 内部运行的 django 代码将请求视为来自不同站点(Docker 外部的站点)并抱怨它。
正确的解决方案是信任您的网站。 在你的settings.py
添加这样一行:
CSRF_TRUSTED_ORIGINS = [
'http://my.web.site.com',
]
有关更多详细信息,请参阅 Django 文档:跨站点请求伪造保护
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.