【发布时间】: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