2013-07-30 73 views
0

每個頁面都有一個網頁,並且表單工作正常。
向我的開始頁面添加了一個表單,並在我的本地服務器中工作正常。
但是,當我將它添加到生產服務器不起作用。
這就是說,CSRF令牌缺失或遺憾
但我已經添加了令牌,它適用於所有其他頁面。CSRF令牌在一個頁面上丟失或不正確

這是什麼我失蹤...?

查看

@login_required 
    def start(request) : 
     libs = Library.objects.all(); 
     header = Header('Start'); 
     studies = None; 
     source = None; 
     if request.method == 'POST' : 
      if 'Show_studie' in request.POST: 
       studies = Study.objects.all; 
      if 'Show_source' in request.POST: 
       source = Source.objects.all; 
     dctArgs = { 
      'library_list': libs, 
      'styles_dir': conf.styles_path, 
      'header': header.html, 
      'studies_list':studies, 
      'source_list':source, 
      'images_dir': conf.images_path, 
      }; 
     return render_to_response('start.html', dctArgs, RequestContext(request)); 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML> 
<HEAD> 
<TITLE></TITLE> 
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/common.css" /> 
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/header.css" /> 
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/Headerstyles.css" /> 
</HEAD> 
<BODY> 
{{header|safe}} 
<h1></h1> 
<table id="doc_tbl" class="data" cellspacing=0> 
<tr> 
    <th>Name</th> 
    <th>Documents</th> 
    <th>Export</th> 
</tr> 
{% for library in library_list %} 
    <tr> 
    <td><a href="/library_overview/{{library.id}}/">{{library.name}}</a></td> 
    <td>{{library.source_set.all|length}}</td> 
    <td><a href="/library_export/{{library.id}}/format/TS/">Andra till Jesper Export</a></td> 
    </tr> 
{% endfor %} 
</table> 
<h3>Messages</h3> 
{{messages}} 
</br> 
<form id="form1" name="form1" method="post" action="/start/" enctype="multipart/form-data"> 
{% csrf_token %} 
<fieldset style="width:300px; margin-left:5px;"> 
<legend> Show all </legend> 
<input type="checkbox" name="Show_studie" value="Show Studie"> Studie 
<input type="checkbox" name="Show_source" value="Show Source"> Source 
</br> 
</br> 
<input type="submit" value="Show All"> 
</fieldset> 
{% if studies_list %} 
<h3> Studies </h3> 
<table class="table1"> 
<thead> 
<tr> 
    <th></th> 
    <th scope="col1" >Name</th> 
    <th scope="col1" >Added by</th> 
</tr> 
</thead> 
{% for study in studies_list %} 
<tbody> 
<tr> 
<td> 
    <a href="/define_study/{{study.id}}/edit/"><img class="icon" src="{{images_dir}}/edit-icon.png"/></a> 
    &nbsp; 
    <img onclick="javascript:return confirmDelete_name('Are you sure? The study and any associated information will be deleted.', {{study.id}}, 'delete_study');" class="icon" src="{{images_dir}}/delete-icon.png"/> 
</td> 
<td><a href="/define_study/{{study.id}}/">{{study.name}}</a></td> 
<td>{{study.metadata_added_by_user.first_name}}&nbsp;{{study.metadata_added_by_user.last_name}}</td> 
</tr> 
{% endfor %} 
</table> 
{% endif %} 
{% if source_list %} 
<h3> Source </h3> 
<table class="table1"> 
<thead> 
<tr> 
    <th></th> 
    <th scope="col1" >Name</th> 
    <th scope="col1" >Added by</th> 
</tr> 
</thead> 
{% for source in source_list %} 
<tbody> 
<tr> 
<td> 
    <a href="/define_study/{{study.id}}/edit/"><img class="icon" src="{{images_dir}}/edit-icon.png"/></a> 
    &nbsp; 
    <img onclick="javascript:return confirmDelete_name('Are you sure? The study and any associated information will be deleted.', {{study.id}}, 'delete_study');" class="icon" src="{{images_dir}}/delete-icon.png"/> 
</td> 
<td><a href="/define_study/{{study.id}}/">{{source.name}}</a></td> 
<td>{{source.metadata_added_by_user.first_name}}&nbsp;{{source.metadata_added_by_user.last_name}}</td> 
</tr> 
{% endfor %} 
{% endif %} 
</tbody> 
</table> 
</form> 
</BODY> 
</HTML> 

禁止(403) CSRF驗證失敗。請求中止。 幫助 給出失敗的原因: CSRF令牌丟失或不正確。

一般而言,如果存在真正的跨站點請求僞造,或者Django的CSRF機制未正確使用時,可能會發生這種情況。對於POST表單,您需要確保:
•視圖函數使用RequestContext作爲模板,而不是Context。
•在模板中,每個POST表單內都有一個{%csrf_token%}模板標籤,用於定位內部URL。
•如果您未使用CsrfViewMiddleware,則必須在使用csrf_token模板標記的任何視圖
以及接受POST數據的視圖上使用csrf_protect。 由於您的Django設置文件中有DEBUG = True,因此您會看到此頁面的幫助部分。將其更改爲False,並且只顯示最初的錯誤消息。
您可以使用CSRF_FAILURE_VIEW設置來自定義此頁面。

設置

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

在頁面中工作,我得到這個消息:

<django.contrib.messages.storage.fallback.FallbackStorage object at 0x03B7A270> 
+0

我們看一些細節,你可以試試這個! – Rohan

+0

除非我們看到您正在使用的代碼,否則我們無法爲您提供幫助。所以用你的'views.py'和你的模板來更新問題是造成問題的原因。 –

+0

CRSF令牌適用於Cookie和HTTP標頭。你改變了網頁瀏覽器嗎?我們是否可以獲得關於服務器和瀏覽器cookie策略的一些信息,以及關於如何添加CSRF令牌的信息? – Ricola3D

回答

1

嘗試包裹在@requires_csrf_token裝飾你的觀點,比如:

from django.views.decorators.csrf import requires_csrf_token 

@requires_csrf_token 
@login_required 
def start(request): 
    ... 
+0

它現在適用於此解決方案。感謝@Vasily Alexeev Knbk Inforian和所有人的幫助。 – kingRauk

0

你可以使用csrf_exempt裝飾器爲特定視圖禁用CSRF保護。

from django.views.decorators.csrf import csrf_exempt 
@csrf_exempt 
def someview(): 
    ...... 

我知道它不是你想要什麼,但如果你想:)

相關問題