Django Angularjs 405方法不允许。 thinkster.io教程

时间:2014-12-05 00:01:08

标签: django angularjs http-status-code-405

我正在浏览以下教程:

https://thinkster.io/brewer/angular-django-tutorial/

我已经通过它获得了大约1 / 3-1 / 2的方式。我现在正在测试它以查看它是否会注册用户。它不会,每次我提交它给我POST http://127.0.0.1:8000/api/v1/accounts/ 405 (METHOD NOT ALLOWED)的表格,我已经通过相同的教程回溯了六次,看看我的错误在哪里,但我似乎无法找到它。

我不是%100肯定问题所在我会发布可能是问题的最可能的代码文件。

authentication/views.py

from django.shortcuts import render

from rest_framework import permissions, viewsets

from authentication.models import Account
from authentication.permissions import IsAccountOwner
from authentication.serializers import AccountSerializer


class AccountViewSet(viewsets.ModelViewSet):
    lookup_field = 'username'
    queryset = Account.objects.all()
    serializer_class = AccountSerializer

    def get_permissions(self):
        if self.request.method in permissions.SAFE_METHODS:
            return (permissions.AllowAny(),)

        if self.request.method == 'POST':
            return (permissions.AllowAny(),)

        return (permissions.IsAuthenticated(), IsAccountOwner(),)

    def create(self, request):
        serializer = self.serializer_class(data=request.DATA)

        if serializer.is_valid():
            account = Account.objects.create_user(**request.DATA)

            account.set_password(request.DATA.get('password'))
            account.save()

            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response({
            'status': 'Bad request',
            'message': 'Account could not be created with received data.'
        }, status=status.HTTP_400_BAD_REQUEST)

static/javascripts/authentication.service.js

/**
* Authentication
* @namespace thinkster.authentication.services
*/
(function () {
    'use strict';

    angular
        .module('thinkster.authentication.services')
        .factory('Authentication', Authentication);

    Authentication.$inject = ['$cookies', '$http'];

    /**
    * @namespace Authentication
    * @returns {Factory}
    */
    function Authentication($cookies, $http) {
        /**
        * @name Authentication
        * @desc The Factory to be returned
        */
        var Authentication = {
            register: register
        };

        return Authentication;

        ////////////////////

        /**
        * @name register
        * @desc Try to register a new user
        * @param {string} username The username entered by the user
        * @param {string} password The password entered by the user
        * @param {string} email The email entered by the user
        * @returns {Promise}
        * @memberOf thinkster.authentication.services.Authentication
        */
        function register(username, password, email) {
            return $http.post('/api/v1/accounts/', {
                username: username,
                password: password,
                email: email
            });
        }
    }
})();

static/templates/register.html

<div class="row">
    <div class="col-md-4 col-md-offset-4">
        <h1>Register</h1>

        <div class="well">
            <form role="form" ng-submit="vm.register()">
                <div class="form-group">
                    <label for="register__email">Email</label>
                    <input type="email" class="form-control" id="register__email" ng-model="vm.email" placeholder="ex. john@notgoogle.com" />
                </div>

                <div class="form-group">
                    <label for="register__username">Username</label>
                    <input type="text" class="form-control" id="register__username" ng-model="vm.username" placeholder="ex. john" />
                </div>

                <div class="form-group">
                    <label for="register__password">Password</label>
                    <input type="password" class="form-control" id="register__password" ng-model="vm.password" placeholder="ex. thisisnotgoogleplus" />
                </div>

                <div class="form-group">
                    <button type="submit" class="btn btn-primary">Submit</button>
                </div>
            </form>
        </div>
    </div>
</div>

最后一次:

static/javascripts/register.controller.js

/**
* Register controller
* @namespace thinkster.authentication.controllers
*/
(function () {
    'use strict';

    angular
        .module('thinkster.authentication.controllers')
        .controller('RegisterController', RegisterController);

    RegisterController.$inject = ['$location', '$scope', 'Authentication'];

    /**
    * @namespace RegisterController
    */
    function RegisterController($location, $scope, Authentication) {
        var vm = this;

        vm.register = register;

        /**
        * @name register
        * @desc Register a new user
        * @memberOf thinkster.authentication.controllers.RegisterController
        */
        function register() {
            Authentication.register(vm.email, vm.password, vm.username);
        }
    }
})();

而且,如果代码不够,项目也会存储在:https://github.com/Taylor-Allred/thinkster-django-angular-boilerplate

我为文本/代码的墙壁道歉,任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

抱歉(无法接受)延迟回复!不确定我是如何错过你的问题的,但我想迟到的答案总比没有答案好。

如果查看urls.py文件,您会发现有两条全能路线。请删除第一个。全能路线必须始终是urls.py文件中的最后一条路线,特别是因为您遇到此错误。

以下是发生的事情:

当您发出请求POST /api/v1/accounts/时,Django会将此与urls.py文件中的第一个包含所有路由进行匹配。这会将请求转发到请求期望提交IndexView方法的post()IndexView没有post()方法,因此请求失败,状态代码为405

即使这是一个非常晚的回应,我希望这对你有帮助。

如果我不清楚的话,请随意评论这个答案!

P.S。 olsonk对于以与代码不兼容的方式注册接受的参数有一点意见。此外,自从我编写教程以来已经过了一段时间。在这个时候,DRF(Django REST框架)已经更新,因此代码可能无法按原样运行。

答案 1 :(得分:1)

我不确定这会解决问题,但我确实发现了一个潜在的问题 - 您的RegisterController register()方法会以与Authentication不同的顺序发送您的参数服务的register()方法。您的服务期望收到(用户名,密码,电子邮件),但您的控制器会发送(电子邮件,密码,用户名)。

我在教程中也遇到了405错误,但我的错误与authentication.service张贴到'/api/v1/register/'而不是'/api/v1/accounts'有关。一旦我开始工作,我就不得不在authentication/views.py - from rest_framework import statusfrom rest_framework.response import Response中添加更多导入。

我也是通过学习这些东西来摸索自己的方式,这是我在StackExchange上的第一个回复,所以如果这没有用,我会道歉/不能完全解决你的问题。

答案 2 :(得分:1)

我有同样的问题,但是当我测试新的帖子提交时。

在搜索完代码后,我终于在posts.service.js

中找到了这个
function create (content) {
        return $http.post('/api/v1/posts', {
            content: content
        });
}

您会注意到POST请求中缺少/。我改成了:

return $http.post('/api/v1/posts/', ...

现在一切都恢复了。