2015-08-03 3 views
0

Я пытаюсь создать простой Restful API с Bottlepy и создать клиент с AngularJS.Что я делаю неправильно с bottlepy + AngularJS + HTTP POST-запрос

Моя проблема заключается в том, что когда я отправить форму с углового клиентом, пост будет идти корыто, и все будет сделано, но результат все равно падает .error функции (данные) в Js стороны, потому что:

XMLHttpRequest не может загрузить http://localhost:8080/category/new. Нет Заголовок «Access-Control-Allow-Origin» присутствует на запрошенном ресурсе . Origin 'http://localhost:8081' поэтому не разрешено доступ.

Вот мой код Python API:

@route('/category/new', method=['OPTIONS', 'POST']) 
def new_category(): 
    print request.forms.keys() 
    if "name" in request.forms: 
     name = request.forms.get('name') 
     _name = db.query(Category).filter_by(name=name).first() 
     if _name: 
      return HTTPResponse(status=409) 
     c = Category(name) 
     print name 
     if not c.validate(): 
      try: 
       db.add(c) 
       db.commit() 
       return HTTPResponse(status=200) 
      except Exception as err: 
       traceback.print_exc() 
       return HTTPResponse(status=500) 
     return HTTPResponse(status=406) 
    return HTTPResponse(status=400) 

У меня также есть CORS включен так:

@hook('after_request') 
def enable_cors(): 
    print "Tried to enable cors" 
    response.headers['Access-Control-Allow-Origin'] = '*' 
    response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT' 
    response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' 

А вот мой angularjs служба:

function addCategory(categoryName){ 
     var payload = $.param({name: categoryName}); 
     return $http({ 
        method: 'POST', 
        url: apiBaseUrl+'category/new', 
        data: payload, 
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' } 
     }) 
     .success(function(data){ 
      return data; 
     }) 
     .error(function(data){ 
      alert("Something went wrong"); 
      return data; 
     }); 
    } 

Любая идея, почему я получаю ошибку Access-ControlAllow-Origin?

В API протоколировать все, кажется, идет просто отлично:

['name'] 
fourth 
Tried to enable cors 
10.0.2.2 - - [03/Aug/2015 10:44:02] "POST /category/new HTTP/1.1" 200 0 
+0

Можете ли вы добавить дамп HTTP-пакета, полученного в браузере? – seanhodges

ответ

0

Ах вопрос, кажется, что bottlepy HTTPResponse не отправляет заголовки даже с крюком.

Поэтому я создал обходное решение, чтобы продолжить работу. Надеюсь, что есть лучший способ.

Так что я в основном создал 2 новые методы:

def set_cors(response): 
    response['Access-Control-Allow-Origin'] = '*' 
    response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT' 
    response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' 

и

def setHTTPResponse(status, body=None): 
    response = None 
    if body != None: 
     response = HTTPResponse(status=status, body=body) 
    else: 
     response = HTTPResponse(status=status) 
    set_cors(response) 
    return response 

, а затем заменить каждый вернуться HTTPResponse вернуться setHTTPResponse. например

- return HTTPResponse(status=200) 
+ return setHTTPResponse(status=200) 
Смежные вопросы