簡體   English   中英

CSRF驗證失敗 - Django

[英]CSRF Verification Failed - Django

好的,所以我一直在瀏覽Rango,Django教程:

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

我實現的大致相同,但改變它以向Guardian Open-Platform 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()

如果還有其他任何有用的東西,請告訴我,我會添加它。

提前致謝!!

如果使用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' %}">缺少% action="{ url 'search' %}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM