【问题标题】:POST request to "/" returns a 403 forbidden对“/”的 POST 请求返回 403 禁止
【发布时间】:2020-08-18 01:19:21
【问题描述】:

我正在尝试通过 POST 请求向 / 路由发送 320 个字符的文本帖子。在这条路线上,我有一个类似 Twitter 的社交网络网站,用于发布帖子和关注用户。为了制作和写帖子,我希望它是异步的,我的意思是,我希望用户写一个帖子,当他按下按钮发布它时,不应该重新加载页面。

这是我的 html 文件:

<div class="container">
  <h1>All Posts</h1>
    <div class="row">
        <div class="span12 well">
            <form method="post">
              {% csrf_token %}
                <textarea class="span11" id="new_message" name="new_message"
                placeholder="Write something nice" rows="5"></textarea>
                <h6 id="characters">320 characters remaining</h6>
                <button class="btn btn-info" type="submit">Post New Message</button>
            </form>
        </div>
    </div>
</div>

这是我在 JavaScript 中尝试做的,但我得到了 403:

document.querySelector("form").onsubmit = () => {
    //sending values by POST method
  fetch('/', {
    method: 'POST',
    body: JSON.stringify({
      content: document.querySelector('#new_message').value,
    })
  })
  .then(response => response.json())
  .then(result => {

      // Print result
      console.log(result);
    })

  event.preventDefault()
  }


});

我也不太确定这是否是正确的做法。

后端:

def index(request):
    if request.method == "POST":
        content = request.POST["new_message"]
        print(request.user)
        print(content)
        return render(request, "network/index.html")
        #post = Posts(user=request.user, content=content)
    return render(request, "network/index.html")


def login_view(request):
    if request.method == "POST":

        # Attempt to sign user in
        username = request.POST["username"]
        password = request.POST["password"]
        user = authenticate(request, username=username, password=password)

        # Check if authentication successful
        if user is not None:
            login(request, user)
            return HttpResponseRedirect(reverse("index"))
        else:
            return render(request, "network/login.html", {
                "message": "Invalid username and/or password."
            })
    else:
        return render(request, "network/login.html")


def logout_view(request):
    logout(request)
    return HttpResponseRedirect(reverse("index"))


def register(request):
    if request.method == "POST":
        username = request.POST["username"]
        email = request.POST["email"]

        # Ensure password matches confirmation
        password = request.POST["password"]
        confirmation = request.POST["confirmation"]
        if password != confirmation:
            return render(request, "network/register.html", {
                "message": "Passwords must match."
            })

        # Attempt to create new user
        try:
            user = User.objects.create_user(username, email, password)
            user.save()
        except IntegrityError:
            return render(request, "network/register.html", {
                "message": "Username already taken."
            })
        login(request, user)
        return HttpResponseRedirect(reverse("index"))
    else:
        return render(request, "network/register.html")

【问题讨论】:

  • 403 表示禁止。没有任何信息,就不可能知道为什么您的后端拒绝该帖子。
  • 能贴出后端代码吗?
  • 你没有发送 CSRF 令牌
  • OK 有后端代码
  • 您没有传递 CSRF 令牌。你只是通过文本区域。您需要在请求正文中传递整个表单。尝试为表单提供一个 ID 并将其字符串化,而不是 #new_message。

标签: javascript python fetch


【解决方案1】:

由于 403 表示禁止,我将尝试检查您尝试调用的实体的权限。确保正确的文件具有正确级别的执行权限。通过您使用的 apache 或其他风格的 Web 服务器检查您的错误日志,访问日志可能会在那里找到一些东西。另外,在您的 JS 中,您正在向控制台记录一些内容,JS 向控制台推送了什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多