2015-03-29 9 views
3

Итак, я шел через Rango, Джанго учебник:CSRF Verification Failed - Джанго

(http://www.tangowithdjango.com/book17/chapters/bing_search.html)

Я реализующий в основном то же самое, но изменяя его, чтобы сделать запрос на Хранитель API открытой платформы. Я думаю, что большинство из них правильное, но каждый раз, когда я пытаюсь выполнить поиск, я получаю ошибку CSRF token missing or incorrect. У меня был хороший поиск вокруг и пробовал много разных решений, но ничего не работает!

Включенная страница html, views и guardian_search.

search.html:

{% extends 'rango/base.html' %} 
{% load staticfiles %} 

{% block title %}Search{% endblock %} 

{% block body_block %} 

<div class="page-header"> 
    <h1>Search with Rango"</h1> 
</div> 

<div class="row"> 
    <div class="panel panel_primary"> 
     </br> 
     <form class="form-inline" id="user_form" method="post" action="{ url 'search' %}"> 
     {% csrf_token %} 
      <!-- Display the search form elements here --> 
      <input class="form-control" type="text" size="50" name="query" value="" id="query" /> 
      <input class="btn btn-primary" type="submit" name="submit" value="Search" /> 
      <br /> 
     </form> 

     <div class="panel"> 
      {% if result_list %} 
       <div class="panel_heading"> 
       <h3 class="panel-title">Results</h3> 
       <!-- Display search results in an ordered list --> 
       <div class="panel-body"> 
        <div class="list-group"> 
         {% for result in result_list %} 
          <div class="list-group-item"> 
           <h4 class="list-group-item-heading"><a href="{{ result.url }}">{{ result.title }}</a></h4> 
           <p class="list-group-item-text">A summary here?</p> 
          </div> 
         {% endfor %} 
        </div> 
       </div> 
      {% endif %} 
      </div> 
     </div> 
    </div> 
</div> 

{% endblock %} 

views.py:

from django.template import RequestContext 
from django.shortcuts import render_to_response 
from rango.bing_search import get_content 

def search(request): 
    result_list = [] 
    if request.method == 'POST': 
     query = request.POST['query'].strip() 
     if query: 
      result_list = get_content(query) 
    return render_to_response('rango/search.html', {'result_list':result_list}) 

guardian_search.py:

import requests 
import pprint as pp 

def get_content(): 

    api_url = 'http://content.guardianapis.com/search?' 
    payload = { 
     'q':     raw_input(''), 
     'api-key':    'api_key', 
     'page-size':   10, 
     'show-editors-picks': 'true', 
     'show-elements':  'None', #'audio', 'image', 'video', 'all' 
     'show-fields':   'None', #'headline' , 'body' 
     'field':    'None', 
    } 

    response = requests.get(api_url, params=payload) 

    data = response.json() 
    urlList = [] 

    for item in data['response']['results']: 
     urlList.append({ 
     'url': item['webUrl'], 
     'title': item['webTitle']}) 

    pp.pprint(urlList) 
    return urlList 

if __name__ == '__main__': 
    get_content() 

Если есть что-нибудь еще, что было бы полезно, дайте мне знать, и Я добавлю.

Спасибо заранее!

ответ

3

Если вы используете render_to_response, вы должны указать RequestContext, чтобы сделать токен CSRF.

return render_to_response('rango/search.html', 
          {'result_list':result_list}, 
          context_instance=RequestContext(request)) 

Однако простое решение, используемое по версии вашего учебника Django 1.7, чтобы использовать render ярлык вместо render_to_response.

from django.shortcuts import render 

render(request, 'rango/search.html', {'result_list':result_list}) 

Как в стороне, у вас есть в action="{ url 'search' %}"> недостающую %.

+0

Отлично. Это сработало с добавлением функции 'guardian_search'' q' в качестве условия поиска 'raw_input'. Благодаря!! – sammy88888888

Смежные вопросы