我希望我的网站登录表单每次刷新页面时都会生成一个新的CSRF令牌.
我试着打电话
logout(request)
request.session.flush()
Run Code Online (Sandbox Code Playgroud)
但即使在服务器重启后,隐藏的表单字段也始终具有相同的标记.
这显然意味着django正在从cookie中读取数据.如何使它忽略cookie并生成一个新的?
或者,有没有办法让我有一个中间页面,在进入实际登录页面之前清除所有cookie?如何在Javascript中删除我的域的所有cookie?
我已经在本地部署了一个带有 Django REST API 框架的 API。我的移动应用程序是使用 Ionic 框架(使用 AngularJS)开发的。
在我的应用程序中,当我想在 Ajax 中请求(POST 方法)时,出现此错误:
CSRF 失败:CSRF 令牌丢失或不正确。
我在 Django REST API 集成项目中请求时没有收到此错误。
我在网上研究了解决方案,但没有一个奏效。
项目信息:
Django 文件settings.py:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'klipix.django-crossdomainxhr-middleware.OrganizationMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
Run Code Online (Sandbox Code Playgroud)
我使用了 TokenAuthentication 方法(http://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication)。我的django-crossdomainxhr-middleware.py文件:
class OrganizationMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
header_token = request.META.get('HTTP_AUTHORIZATION', None)
if header_token is not None:
try:
token = sub('Token ', '', request.META.get('HTTP_AUTHORIZATION', None))
token_obj = …Run Code Online (Sandbox Code Playgroud) 我正在使用基于类的视图.
class UserCreate(View):
def post(self, request):
data = request.data.get
social_id = data('social_id')
social_source = data('social_source')
user = User(social_id=social_id, social_source=social_source, access_token=access_token)
user.save()
return JsonResponse({'response':200})
Run Code Online (Sandbox Code Playgroud)
它说,每当我在这个URL上发布数据时 CSRF token missing or incorrect.
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
\"social_id\": \"string\",
\"social_source\": \"FB/Gmail\",
\"access_token\": \"string\"
}" "http://127.0.0.1:8000/users/"
Run Code Online (Sandbox Code Playgroud)
我在从函数视图中的表单中获取数据时遇到了这个问题.在那里我曾经在我的视图上添加@csrf_exempt,它会工作.当我将@csrf_exempt添加到我的post方法时,它不起作用.我该如何发布数据?
我之前遇到过这个问题并已解决,但是这完全是随机弹出的(看起来如此)。离开项目一会儿后,我刚刚回到我的Django项目...登录时,我忘记了我的Web用户名,它给了我适当的错误消息Sorry, that's not a valid username or password。因此,为了解决这个问题,我创建了一个新的超级用户(因为我也忘记了管理员用户名),因此可以检查我的Web用户名是什么。我成功完成了此操作,但是现在尝试登录时,出现CSRF错误(无论用户名或密码是否正确)。我不知道这是怎么发生的,因为它已经在10秒钟前正确验证了,而且我没有更改任何一行代码。
{% extends "base.html" %}
{% block content %}
<title>{% block title %} | Login{% endblock %}</title>
<h2>Login</h2>
{% if form.errors %}
<p class="error">Sorry, thats not a valid username or password</p>
{% endif %}
<form action="/accounts/auth/" method="POST">{% csrf_token %}
<label for="username">Username: </label>
<br>
<input type="text" name="username" value="" id="username">
<br><br>
<label for="password">Password: </label>
<br>
<input type="password" name="password" value="" id="password">
<br><br>
<input type="submit" value="Login">
</form>
{% endblock content %}
Run Code Online (Sandbox Code Playgroud) 我是 Django 的新手,刚刚从另一个开发人员手中接手了这个项目。到目前为止我所做的就是从 git 克隆代码并安装依赖项。
在设置项目并运行python manager.py runserver并转到之后,localhost:8000/admin我立即收到一条错误消息,指出TypeError at /admin/login/:'CsrfViewMiddleware' object is not iterable
追溯:
内部 39 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/core/handlers/exception.py”。
response = get_response(request)_legacy_get_response 249 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/core/handlers/base.py”。
response = self._get_response(request)_get_response 217 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/core/handlers/base.py”。
response = self.process_exception_by_middleware(e, request)_get_response 215 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/core/handlers/base.py”。
response = response.render()渲染 109 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/template/response.py”。
self.content = self.rendered_content在 render_content 86 中文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/template/response.py”。
content = template.render(context, self._request)渲染 66 中的文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/template/backends/django.py”。
return self.template.render(context)在渲染 206 中文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/template/base.py”。
with context.bind_template(self):59中的文件“/usr/lib/python3.5/contextlib.py”
__enter__。return next(self.gen)文件“/home/abhay/code/virtualenvironments/leaguesx/lib/python3.5/site-packages/django/template/context.py”在bind_template 236中。
updates.update(processor(self.request))异常类型:/admin/login/ …
我有这样的api方法:
@api_view(['POST'])
@login_required
def get_posts(request):
# ...
Run Code Online (Sandbox Code Playgroud)
如何仅在此方法上禁用 CSRF ?
如何在 Django 的 get 方法中隐藏 CSRF 令牌?当我们调用 get 方法时,只有参数需要在浏览器 URL 中可见,而不是 CSRF 令牌。
我为大学创建了一个 Django 应用程序(“监考管理系统”)。我没有包含任何登录授权,因为它只会被大学管理员使用。在这个应用程序中,我还剩下一项任务,我必须通过邮件为数据库中的所有用户发送可用性表格,要求他们填写表格,无论他们当天是否有空,根据他们的回复我必须存储它们在数据库中的可用性状态。如何通过邮件发送表格?或者我应该向他们发送表格的链接?如果我必须发送链接,如何仅通过更改他们获得的链接来防止一个用户访问其他用户的表单,知道如何添加令牌及其唯一 id 吗?
因此,我对我的项目进行了部署,在我的网络使用 HTTPS 后,Django 现在向我显示此错误:

它发生在我的登录页面之后:login.html
{% load i18n static bootstrap4 %}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{% static 'web_site/css/login.css' %}" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="{% static 'web_site/js/login.js' %}"></script>
</head>
<body>
<div class="wrapper">
<div class="container">
<h1>Welcome</h1>
{% if context %}
<ul class="messages">
<li class="error">{{ context }}</li>
</ul>
{% endif %}
<form class="form" action="" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<button type="submit" id="login-button">Login</button>
</form>
</div>
<ul class="bg-bubbles">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li> …Run Code Online (Sandbox Code Playgroud) Forbidden (CSRF token missing or incorrect.)当我尝试使用登录页面时收到错误。
场景如下:
Forbidden (CSRF token missing or incorrect.)错误。csrf_token是在表格中。为什么会发生这种情况?我该如何修复它?
我不知道这会有帮助,但这是我的views.py登录信息
class Login_View(LoginView):
template_name = 'login.html'
def post(self, request, *args, **kwargs):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
response_data = {}
if user is not None:
if user.is_active:
login(request, user)
response_data['result'] = 'success'
else:
return HttpResponse("Inactive user.")
else:
response_data['result'] = 'fail'
return HttpResponse(json.dumps(response_data), content_type="application/json")
Run Code Online (Sandbox Code Playgroud) 我向 CORS_ALLOWED_ORIGINS 和 CSRF_TRUSTED_ORIGINS 以及 ALLOWED_HOSTS 添加了域的多个变体。我添加django.template.context_processors.csrf到 context_processors 中。我没有将 CSRF_COOKIE_SECURE 和 SESSION_COOKIE_SECURE 设置为 true (我希望我可以更改)。我想不出还有什么可以让它在 Django admin 上工作,并且在我设置会话身份验证(包括配置 csrf 和会话 cookie)后它才停止工作。当我没有对前端进行任何身份验证时,Django 登录工作正常,甚至像我说的那样,它在本地主机上工作正常。
我真的很感激任何有关我可以尝试解决此问题的其他建议。
更新:现在我收到此错误消息 Referer checking failed - https://myapp.herokuapp.com/admin/login/?next=/admin/ does not match any trusted origins.
我认为问题可能在于它是一个 heroku 子域,所以我添加了一个域和一个 SSL 证书。新域出现完全相同的错误。
我的 CORS_ALLOWED_ORIGINS 包括https://myapp.herokuapp.comandhttps://www.example.com和,因为斜杠不断从浏览器复制,https://www.example.com/. 即使有 SSL 证书,我也包含了每个地址的 http:// 版本。
django ×11
django-csrf ×11
csrf ×5
python ×3
ajax ×1
angularjs ×1
csrf-token ×1
django-admin ×1
django-views ×1
javascript ×1