html中的csrf标记,但无法设置cookie

时间:2014-10-01 18:03:13

标签: python django

首先,我转到localhost:8000查看以下页面:

</div>        

< form id="SignUpForm"  name="form_signupform"  method="post" action="hello/" > 

{% csrf_token %}  
< fieldset class="roundedCorners"  style = "display: table;"  >
< legend align="center"><em>Sign Up</em></legend>
< p></p>
< p style="display: block;">

etc.

在localhost:8000上,使用views.py中的函数提供上述页面视图:

def login(request):  
    c = {}  
    c = {'query': 'abcd.com'}  
    response = render_to_response('index.html', c,context_instance=RequestContext(request))  
    return response   

在这里,在提供的页面源代码中,我可以看到如下的csrf值:

< form  id="SignUpForm"  name="form_signupform"  method="post" action="hello/" >
< input type='hidden' name='csrfmiddlewaretoken'      
value='rjbU4k8DY3EEBWVhlsgIYU3gEu4x3ctM' / >   
< fieldset class="roundedCorners"  style = "display: table;" >
< legend align="center"><em>Sign Up</em></legend>
< p >< /p >
< p style="display: block;"> 

etc.

按下提交按钮时,会调用另一个视图。在views.py

def hello(request):  
    if request.method == "POST":  
        return HttpResponseRedirect("genResp1.html")  
    else:  
        return HttpResponseRedirect("genResp2.html")  

但是,按下提交按钮后,我收到以下错误:

Forbidden (403)
    CSRF verification failed. Request aborted.
...
...
Help
Reason given for failure:
    CSRF cookie not set.

::我已经咨询了a)django docs,b)stackoverflow.com,c)google等等。我已经尝试了所有可能的排列组合代码......但是恐怖从未改变过......(我可以设置cookie调用set_cookie函数...工作正常...但csrf cookie无法设置...为什么?)请不要搜索网络和写入解决方案。我已经搜索了最近6天。我已经尝试了所有形式的视图功能。其中一个是上面的。如果您已经完成了CSRF自己的工作并且正在运行,那么请写下你怎么做...(我使用的是python 3.4和django 1.7)

2 个答案:

答案 0 :(得分:1)

通过将Asset设置为CSRF_COOKIE_SECURE来解决问题,因为我在开发计算机上没有使用HTTPS:

  1. 修改了包含以下行的文件False

    settings.py
  2. 将其更改为:

    CSRF_COOKIE_SECURE = True
    SESSION_COOKIE_SECURE = True
    

答案 1 :(得分:0)

好吧......我认为上面的内容是正确的......但在设置中我写了以下内容......

# CSRF_COOKIE_NAME = 'csrfmiddlewaretoken' 
# CSRF_COOKIE_DOMAIN = 'localhost:8000' # your domain name 
# CSRF_COOKIE_SECURE = False 
# CSRF_COOKIE_HTTPONLY = False 
# CSRF_COOKIE_AGE = None 
# CSRF_COOKIE_USED = True 
# CSRF_COOKIE_PATH = 'C:\\Users\\me\\Desktop\\cookFol' 

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

...看到我注释掉那些并且它有效...... 上面的代码是一样的,可能是那些设置定制中有任何不匹配...