我正在浏览以下教程:
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
我为文本/代码的墙壁道歉,任何帮助都将不胜感激。
答案 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 status
和from 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/', ...
现在一切都恢复了。