不允许的方法 (POST):/profiles/flash/ 不允许的方法:/profiles/flash/

Posted

技术标签:

【中文标题】不允许的方法 (POST):/profiles/flash/ 不允许的方法:/profiles/flash/【英文标题】:Method Not Allowed (POST): /profiles/flash/ Method Not Allowed: /profiles/flash/ 【发布时间】:2021-02-09 04:58:48 【问题描述】:

这里我只是想用 django 和 jQuery ajax 在 django 模板中添加跟随切换按钮,但我得到一个错误

不允许的方法 (POST):/profiles/flash/

不允许的方法:/profiles/flash/

我不明白我犯错的地方。甚至我还检查了我的代码。

html

<form method='post'>
          <button class="btn % if is_following %btn-warning% else %btn-primary% endif %" id="like-button" toggle="user.userprofile">% csrf_token %
           % if is_following %Unfollow % else %Follow% endif %
          </button>
        </div>
        </form>

jquery,ajax

<script>
   var user = $('#test').attr('user');
   console.log(user,'test purpose');
  $(document).on('click', '#follow-button', function (e) 
    e.preventDefault();
    $.ajax(
      type: 'POST',
      url: '% url "profiles:follow" %',
      data: 
        user_toggle: user,
        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
        action: 'post'
      ,
      success: function (json) 
        document.getElementById("is_following").innerHTML = json['is_following']
      ,
      error: function (xhr, errmsg, err) 
      
    );
  )
</script>

urls.py

app_name = 'profiles'

urlpatterns = [ path('<str:username>/',UserProfileDetailView.as_view(),name = 'detail'),
    path('follow/',follow,name = 'follow'),
]

views.py

def follow(request):
     if request.POST.get('action') == 'post':
        result = ''
        profile_ = UserProfile.objects.get(user__username__iexact=request.user.username)
        is_following = False
        username_to_toggle=request.POST.get('user_toggle')
        follower = profile_.follower.filter(username__iexact=username_to_toggle).first()
        if follower:
            profile_.follower.remove(follower.id)
        else:
            new_follower = User.objects.get(username__iexact=username_to_toggle)
            profile_.follower.add(new_follower.id)
            is_following = True
        return JsonResponse('is_following': is_following, )

如果需要更多信息,请在评论部分告诉我。我会用这些信息更新我的问题。

【问题讨论】:

因此该消息来自您的服务器,不允许您发布到该路径。尝试使用 curl(或邮递员)首先检查您的 api(如:没有 ajax 的东西)此外,您的服务器的其余部分是什么?似乎它并没有以您认为的方式暴露端点。您可能想要添加一个 MWE,以便我们可以重现。 好吧,我没有为此使用rest api。我只是从 django/http 文件中导入 jsonresponse 类。 好的,让我试着澄清一下,当错误发生时。你渲染一些按钮,这行得通,对吧?然后你点击那个按钮,它会向你的 python 后端发送一个 POST 请求,对吧?在响应中你得到一个 405 对吗? MWE 会有所帮助。 Flash实际上是用户的用户名 我添加了views.py,其中follow函数与该url链接 【参考方案1】:

follow 方法缺少应该接受 POST 请求的信息。默认为GET

在您的views.py import api_view 并注解follow 方法:

from rest_framework.decorators import api_view 

@api_view(['POST']) 
def follow(request):
    ...

更多信息在这里:https://www.django-rest-framework.org/tutorial/2-requests-and-responses/

顺便说一句:您不需要在data 中拥有action 属性。事实上,您通过POST 发送请求就足够了。

【讨论】:

我已经提出了新问题,这是关于部署的,请看一下,我相信你可以解决这个问题,谢谢 :) ***.com/questions/65742988/…【参考方案2】:

当我通过以下代码更新以前的代码时,它起作用了: html

          <button class="btn % if is_following %btn-warning% else %btn-primary% endif %" id="follow-button" toggle="user.userprofile">% csrf_token % #Change the id name
           % if is_following %Unfollow % else %Follow% endif %
          </button>
        </div>

ajax:

<srcipt>
 $(document).on('click', '#follow-button', function (e) 
    e.preventDefault();
    $.ajax(
      type: 'POST',
      url: '% url "profiles:toggle" %',
      data: 
        user_toggle: user,
        csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
        action: 'POST',
      ,
      success: function (json) 
        document.getElementById("is_following").innerHTML = json['result']
      ,
      error: function (xhr, errmsg, err) 
      
    );
  )
</script>

views.py #将函数基视图改为类基视图并添加post函数。

class UserProfileFollowToggle(LoginRequiredMixin,View):
    login_url = '/accounts/login/'
    def post(self, request):
            username_to_toggle = request.POST.get("user_toggle")
            profile_, is_following = UserProfile.objects.toggle_follow(request.user, request.user.id ,username_to_toggle)
def toggle_follow(self, request_user,user_id, username_to_toggle):
        profile_ = UserProfile.objects.get(user__username__iexact=request_user.username)
        is_following = False
        follower = profile_.follower.filter(username__iexact=username_to_toggle).first()
        if follower:
            profile_.follower.remove(follower.id)
        else:
            new_follower = User.objects.get(username__iexact=username_to_toggle)
            profile_.follower.add(new_follower.id)
            is_following = True
            return JsonResponse('result': is_following, )

     

【讨论】:

以上是关于不允许的方法 (POST):/profiles/flash/ 不允许的方法:/profiles/flash/的主要内容,如果未能解决你的问题,请参考以下文章

为啥不允许我的 Post 方法?

带有ajax jQuery的405(不允许方法)(POST)方法

使用 Jquery 的 $.post() 的 POST 请求,不允许使用 405 方法

CORS 实现显示不允许用于 POST 请求的方法

不允许使用 Django 方法 (POST)

方法不允许 (POST) Django 405 错误