Django CSRF 问题
Django CSRF Issues
我正在尝试制作一个简单的登录框架供以后在我的站点中使用,目前它非常基础,但我一直被 Django CSRF 保护拖延
我采取的步骤:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'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',
'django.middleware.security.SecurityMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
)
启用 CSRFViewMiddleware
def request_page(request):
if(request.POST.get('btnLogin')):
if(handleLogin( (request.POST.get('TFUsername')), (request.POST.get('TFPassword')))):
return HttpResponse("yep")
else:
return HttpResponse("nope")
在登录中调用这个方法handler.py
def handleLogin(enteredUsername, enteredPassword):
EvalDBLogin.objects
b = EvalDBLogin(username = enteredUsername,password = enteredPassword)
if b.exists():
return True
else:
return False
视图函数确实将请求传递给模板的呈现方法,如上所示
每个表单元素包含 {% csrf_token %}
<td width="252"> </td>
<td width="272"><table width="258" height="115" border="0" align="center">
<tr>
<td width="248" height="27"><form id="form1" name="form1" method="post" action="#">{% csrf_token %}
<label for="TFUsername"></label>
<input name="TFUsername" type="text" class="loginBoxes" id="TFUsername" value="username" size="100" maxlength="42" border="5" width="200px"/>
</td>
</tr>
<tr>
<td height="26"><input name="TFPassword" type="password" class="loginBoxes" id="TFPassword" value="password" size="42" maxlength="42" /></td>
</tr>
<tr>
<td height="43">
<input type="submit" name="btnLogin" id="btnLogin" value="Submit" />
</form></td>
</tr>
</table></td>
<td width="252"> </td>
</tr>
</table></td>
模板上下文处理器如下所示:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages",
"LoginSystem",
)
我是不是遗漏了什么,或者这是我的技术问题?
显示的问题:http://puu.sh/jsRQh/384a552b2e.png
我知道 SO 上已经有一些关于此的问题,但我找不到完全回答我问题的问题。
附带说明,如果我从 csrf
中免除以下方法,则会返回相同的错误
非常感谢帮助!
已呈现 Html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>
<style type="text/css">
.loginBoxes {
font-family: "Comic Sans MS", cursive;
font-size: 14px;
color: #AFAFAF;
background-color: #F8F8F8;
text-align: center;
width: auto;
}
#TFUsername {
border-radius: 15px 50px;
padding: 20px;
width: 300px;
height: 20px;
}
#TFPassword {
border-radius: 15px 50px;
padding: 20px;
width: 300px;
height: 20px;
}
#btnLogin{
border-radius: 25px;
background: #0066FF;
display: table-cell;
width: 310px;
display:table-cell;
margin:auto;
display:block;
height: 31px;
}
</style>
</head>
<body>
<table width="800" height="722" border="0" align="center">
<tr>
</tr>
<tr>
<td><table width="800" height="253" border="0" align="center">
<tr>
<td width="252"> </td>
<td width="272"><table width="258" height="115" border="0" align="center">
<tr>
<td width="248" height="27"><form id="form1" name="form1" method="post" action="#">
<label for="TFUsername"></label>
<input name="TFUsername" type="text" class="loginBoxes" id="TFUsername" value="username" size="100" maxlength="42" border="5" width="200px"/>
</td>
</tr>
<tr>
<td height="26"><input name="TFPassword" type="password" class="loginBoxes" id="TFPassword" value="password" size="42" maxlength="42" /></td>
</tr>
<tr>
<td height="43">
<input type="submit" name="btnLogin" id="btnLogin" value="Submit" />
</form></td>
</tr>
</table></td>
<td width="252"> </td>
</tr>
</table></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</body>
</html>
模板渲染
def index(request):
template = loader.get_template('loginSystem/index.html')
return HttpResponse(template.render())
您已经包含了两次 csrf 中间件。第二次可以去掉。
'django.middleware.csrf.CsrfViewMiddleware',
你可以去掉csrf_protect
装饰器,因为你使用的是中间件,默认情况下所有视图都会被保护。
由于您正在使用 RequestContext
,您可以从模板上下文处理器中删除 "django.core.context_processors.csrf"
,因为它始终包含在内。
请求上下文应该是 render_to_response
的第三个参数,而不是第二个:
return render_to_response('loginSystem/index1.html', {}, csrfContext)
但是您最好使用 render
快捷方式,这样您就根本不需要请求上下文了。
from django.shortcuts import render
return render(request, 'loginSystem/index1.html')
如果在进行这些更改后它仍然不起作用,请在上面更新您的问题,并包括 post 渲染模板的样子。
我正在尝试制作一个简单的登录框架供以后在我的站点中使用,目前它非常基础,但我一直被 Django CSRF 保护拖延
我采取的步骤:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'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',
'django.middleware.security.SecurityMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
)
启用 CSRFViewMiddleware
def request_page(request):
if(request.POST.get('btnLogin')):
if(handleLogin( (request.POST.get('TFUsername')), (request.POST.get('TFPassword')))):
return HttpResponse("yep")
else:
return HttpResponse("nope")
在登录中调用这个方法handler.py
def handleLogin(enteredUsername, enteredPassword):
EvalDBLogin.objects
b = EvalDBLogin(username = enteredUsername,password = enteredPassword)
if b.exists():
return True
else:
return False
视图函数确实将请求传递给模板的呈现方法,如上所示
每个表单元素包含 {% csrf_token %}
<td width="252"> </td>
<td width="272"><table width="258" height="115" border="0" align="center">
<tr>
<td width="248" height="27"><form id="form1" name="form1" method="post" action="#">{% csrf_token %}
<label for="TFUsername"></label>
<input name="TFUsername" type="text" class="loginBoxes" id="TFUsername" value="username" size="100" maxlength="42" border="5" width="200px"/>
</td>
</tr>
<tr>
<td height="26"><input name="TFPassword" type="password" class="loginBoxes" id="TFPassword" value="password" size="42" maxlength="42" /></td>
</tr>
<tr>
<td height="43">
<input type="submit" name="btnLogin" id="btnLogin" value="Submit" />
</form></td>
</tr>
</table></td>
<td width="252"> </td>
</tr>
</table></td>
模板上下文处理器如下所示:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.contrib.messages.context_processors.messages",
"LoginSystem",
)
我是不是遗漏了什么,或者这是我的技术问题?
显示的问题:http://puu.sh/jsRQh/384a552b2e.png
我知道 SO 上已经有一些关于此的问题,但我找不到完全回答我问题的问题。
附带说明,如果我从 csrf
中免除以下方法,则会返回相同的错误非常感谢帮助!
已呈现 Html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Login</title>
<style type="text/css">
.loginBoxes {
font-family: "Comic Sans MS", cursive;
font-size: 14px;
color: #AFAFAF;
background-color: #F8F8F8;
text-align: center;
width: auto;
}
#TFUsername {
border-radius: 15px 50px;
padding: 20px;
width: 300px;
height: 20px;
}
#TFPassword {
border-radius: 15px 50px;
padding: 20px;
width: 300px;
height: 20px;
}
#btnLogin{
border-radius: 25px;
background: #0066FF;
display: table-cell;
width: 310px;
display:table-cell;
margin:auto;
display:block;
height: 31px;
}
</style>
</head>
<body>
<table width="800" height="722" border="0" align="center">
<tr>
</tr>
<tr>
<td><table width="800" height="253" border="0" align="center">
<tr>
<td width="252"> </td>
<td width="272"><table width="258" height="115" border="0" align="center">
<tr>
<td width="248" height="27"><form id="form1" name="form1" method="post" action="#">
<label for="TFUsername"></label>
<input name="TFUsername" type="text" class="loginBoxes" id="TFUsername" value="username" size="100" maxlength="42" border="5" width="200px"/>
</td>
</tr>
<tr>
<td height="26"><input name="TFPassword" type="password" class="loginBoxes" id="TFPassword" value="password" size="42" maxlength="42" /></td>
</tr>
<tr>
<td height="43">
<input type="submit" name="btnLogin" id="btnLogin" value="Submit" />
</form></td>
</tr>
</table></td>
<td width="252"> </td>
</tr>
</table></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</body>
</html>
模板渲染
def index(request):
template = loader.get_template('loginSystem/index.html')
return HttpResponse(template.render())
您已经包含了两次 csrf 中间件。第二次可以去掉。
'django.middleware.csrf.CsrfViewMiddleware',
你可以去掉csrf_protect
装饰器,因为你使用的是中间件,默认情况下所有视图都会被保护。
由于您正在使用 RequestContext
,您可以从模板上下文处理器中删除 "django.core.context_processors.csrf"
,因为它始终包含在内。
请求上下文应该是 render_to_response
的第三个参数,而不是第二个:
return render_to_response('loginSystem/index1.html', {}, csrfContext)
但是您最好使用 render
快捷方式,这样您就根本不需要请求上下文了。
from django.shortcuts import render
return render(request, 'loginSystem/index1.html')
如果在进行这些更改后它仍然不起作用,请在上面更新您的问题,并包括 post 渲染模板的样子。