2014-12-05 2 views
1

Я бегу через учебник по адресу:Метод Django Angularjs 405 не допускается. thinkster.io учебник

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. [email protected]" /> 
       </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

Извиняюсь за стену текста/кода, любая помощь будет оценена.

ответ

1

Я не уверен, что это будет делать трюк, но я заметил одну потенциальную проблему - register() метод ваши RegisterController «ы отправляет свои аргументы в различном порядке register() метода вашего Authentication службы. Ваш сервис ожидает получать (имя пользователя, пароль, адрес электронной почты), но ваш контроллер отправляет (адрес электронной почты, пароль, имя пользователя).

Я также столкнулся с ошибкой 405 в учебнике, но моя ошибка связана с моим authentication.service проводкой до '/api/v1/register/' вместо '/api/v1/accounts'. Как только у меня была эта работа, мне пришлось добавить еще несколько импортных товаров в authentication/views.py - from rest_framework import status и from rest_framework.response import Response.

Я тоже пытаюсь научиться этому материалу, и это мой первый ответ на StackExchange, поэтому я приношу свои извинения, если это не помогает/не полностью устраняет вашу проблему.

+0

Я ценю ответ, я дам это попробовать позже сегодня вечером. – TaylorAllred

+0

Just FYI - Сегодня я завернул учебник и получил (почти полностью) работу; сейчас проблема только в том, что сообщения иногда не отображаются в профиле. Проект находится в [https://github.com/olsonk/thinkster-django-angular-boilerplate.git](https://github.com/olsonk/thinkster-django-angular-boilerplate.git). Надеюсь, что это полезно. Я нашел несколько ошибок в шаблоне, которым потребовалось довольно много времени, чтобы найти и исправить, поэтому он может служить источником двойной проверки. – olsonk

3

Извините за (неприемлемо) отложенный ответ! Не уверен, как я пропустил ваши вопросы, но, полагаю, поздний ответ лучше, чем никакого ответа.

Если вы посмотрите на свой файл urls.py, вы заметите, что у вас есть два маршрута для всех маршрутов. Удалите первый. Маршрут catch-all всегда должен быть последним маршрутом в файле urls.py специально по той причине, что вы испытываете эту ошибку.

Вот что происходит:

Когда вы делаете запрос POST /api/v1/accounts/, Django сопрягает это против первого броской всего маршрута в файле urls.py.Это перенаправляет запрос на IndexView, где запрос ожидает файл post(). IndexView не имеет метода post(), поэтому запрос завершается с кодом состояния 405.

Несмотря на то, что это очень поздний ответ, я надеюсь, что это поможет вам.

Не стесняйтесь прокомментировать этот ответ, если я не был чист!

P.S. У olsonk есть точка, чтобы зарегистрировать принятые аргументы таким образом, который несовместим с вашим кодом. Кроме того, прошло некоторое время с тех пор, как я написал учебник. За это время DRF (Django REST Framework) обновился, и поэтому код может не работать как есть.

+0

Я пошел по тому же учебнику, чтобы создать метод регистрации в django и angularJs, но, к сожалению, я не могу получить доступ к localhost: 8000/register url, я столкнулся с ошибкой здесь, которая является ** "name 'IndexView' is не определено "** указывает файл urls.py, где ** url ('^. * $', IndexView.as_view(), name = 'index') **, существует. я действительно разочарован. – RTan

+1

Прошу прощения, что вы разочарованы. Я предполагаю, что отсутствует указатель импорта для IndexView. –

1

У меня была такая же проблема, но когда я тестировал новое сообщение.

После охоты через мой код, я наконец-то нашел это в моем posts.service.js:

function create (content) { 
     return $http.post('/api/v1/posts', { 
      content: content 
     }); 
} 

Вы заметите, что есть / отсутствует запрос POST. Я изменил его на:

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

И теперь все работает снова.

Смежные вопросы