Django. csfr_token

150
27 октября 2019, 10:20

Скорее всего, не вижу чего-то очевидного, но тем не менее прошу вашей помощи.

Ошибка: Forbidden (403) CSRF verification failed. Request aborted.

views.py

def addCom(request):
    if request.method == "POST":
        message = request.POST["addcom"]
        print("-->" + str(message) + "<--")
    else:
        print(print("-->" "ЧТО-ТО НЕ ПОЛУЧИЛОСЬ" + "<--"))
    s = str(request)
    pos = s.find("ID=") + 3
    pos1 = s.rfind("%7D")
    pos2 = s.find("!")+1
    pos3 = s.rfind("??")
    ip = s[pos:pos1]
    objID = s[pos2:pos3]
    con = sqlite3.connect('users.db')
    cur = con.cursor()
    cur.execute('SELECT objName FROM objID_objName WHERE objID = "{}"'.format(objID))
    name = cur.fetchall()
    name = name[0][0]
    print("-->" + str(name) + "<--")
    print("-->" + str(objID) + "<--")
    cur.execute('SELECT * FROM ip_ipINT_port_stat_prot_serv_objID WHERE ip = "{}"'.format(ip))
    table_test = []
    for row in cur.fetchall():
        table_test.append(row)
    f = open("viewInfo/static/assets/{}-XML".format(name), "r")
    file = f.read()
    date = file[file.find("initiated")+9:file.find(" as: ")]
    context = {'ip': ip, 'name': name, 'objID': objID, 'table_test': table_test, 'date': date}
    return render_to_response("info.html", context)

Логику можно не рассматривать, суть не в ней. Достаточно посмотреть первые строки.

.html

                            <form action="/viewInfo/addCom?projectID={{ip}}}!{{objID}}??" method="post">
                                {% csrf_token %}
                                <label for="addcom">Добавить комментарий: </label>
                                <p><textarea id="addcom" rows="8" cols="50" name="addcom"></textarea></p>
                                <button type="submit" value="Добавить", class="btn btn-primary">Добавить</button>
                            </form>

В чем может быть проблема? В других местах делаю аналогично и все работает...

Answer 1

Попробуйте заменить render_to_response() (которая устарела) на render(), которая принимает requestв качестве первого аргумента.

В документации сказано, что для корректной работы защиты от CSRF нужно рендерить ответ с помощью RequestContext(). Функция render() использует его по умолчанию.

from django.shortcuts import render

def addCom(request):
    ....
    return render(request, "info.html", context)
Answer 2

По-моему, у Вас лишняя фигурная скобка в форме html, в action после ip, попробуйте исправить.

READ ALSO
Selenium webdriver проблема с циклом повтора действий

Selenium webdriver проблема с циклом повтора действий

Всем привет, есть такой код который я не могу допилить чтобы он выполнял одно и то же действие до определённого периода те

156
Получение ссылки на запись разговора Asterisk (AsterNET C#)

Получение ссылки на запись разговора Asterisk (AsterNET C#)

Как можно получить с помощью библиотеки AsterNET получить ссылку на файл записи разговора в Asterisk? Есть CRM, в ней есть библиотека AsterNETПри входящем...

115
Конвертировать BSTR* retVal что бы вывести string в printf

Конвертировать BSTR* retVal что бы вывести string в printf

на шарпе написана DLL вызывается в С++, в DLL передаю строку и обратно должен получить строку, но как ее вывести на экран

114
wordpress 5 и gutenberg вывести на странице изображения

wordpress 5 и gutenberg вывести на странице изображения

Необходимо вывести на странице с галереей изображения в том порядке в котором я их располагаю в редакторе gutenberg, а wp выводит их в порядке добавления...

131