如何处理 Django 视图中的 csrf 保护?

How to handle with csrf-protecting in Django views?

您好,感谢您的回复。

1) 我有一个带有 textdigit

的模型
class Mention(models.Model):
    mentionn = models.ForeignKey(Step, on_delete=models.CASCADE)
    mention_text = models.TextField()
    mention_digit = models.IntegerField()

2) 定制的(不是 django,所以它没有任何 modelForm 等等),它请求 textdigit

<form action="/addcomment{{ stepid }}" method="post">
{% csrf_token %}
<label>
Your text
<textarea name = "mention_text" class="text-area-width" placeholder="You rваш отзыв"></textarea>
</label>
    <label>How much stars?
        <select name="mention_digit">
            <option value="5">5 star</option>
            <option value="4">4 star</option>
            <option value="3">3 star</option>
            <option value="2">2 star</option>
            <option value="1">1 star</option>
        </select>
        </label>
    <input type="submit" class="success expanded button" value="publish"/>
</form>

3) 接下来我做了一个视图,生成它:

def addcomment(request, step_id):
    done = csrf(request)
    if request.POST:
       mentionn = Step(id=step_id)
       mention_text = request.POST.get('mention_text', '')
        mention_digit = request.POST.get('mention_digit', '')
        mentionn_obj = Mention(mentionn=mentionn, mention_text=mention_text, mention_digit=mention_digit)
        mentionn_obj.save()        
    return redirect('/step'+ step_id, done)

它提出了一个问题,即 csrf_token 缺失或不正确。如果我在我的视图中设置了一个 @csrf_exempt 装饰器,一切正常(但保护已关闭)。

所以我的任务是让它发挥作用。我不想使用 django 表单,因为它很难自定义并使外观漂亮。


网页的全局模型:

class Step(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    annotation = models.TextField()
    main_text = models.TextField()
    main_photo = models.ImageField(upload_to='', height_field=None, width_field=None, max_length=100)
    true_question = models.TextField()
    true_answer = models.TextField()
    true_link = models.CharField(max_length=200, default="http://lieman.ru/exshelp/")

查看,生成所有页面:

def step(request, step_id):
    stepfields = get_object_or_404(Step, id = step_id)
    navigators = Navigation_bar.objects.filter(navigatorr_id = step_id)
    mentionship = Mention.objects.filter(mentionn_id = step_id)
    username = auth.get_user(request).username
    stepid = step_id
    context = {
        "stepfieldst" : stepfields,
        "navigators" : navigators,
        "mentionship" : mentionship,
        "stepid" : stepid,
        "username" : username,
    }
    return render_to_response('bakot/step.html', context)

enable CSRF protection,您需要在呈现使用 {% csrf_token %} 标记的模板时包含请求。

目前,您没有为 step 视图执行此操作。最简单的方法是使用 render 而不是 render_to_response.

return render(request, 'bakot/step.html', context)

不清楚 make = csrf(request) 在您的 add_comment 视图中的作用,但我认为这不是必需的。