2017-11-13 9 views
0

병을 사용하여 RESTful API를 작성하려고합니다. 현재 HTTP 메소드 Patch를 구현하는 데 문제가 있습니다. 누군가 내가 잘못하고있는 것을 찾는 것을 도와 줄 수 있기를 바랍니다. 저는 파이썬, 병 및 mongodb에 대해 매우 익숙합니다. 따라서 학습 과정이 더 필요합니다. 여기 병 프레임 워크와 pymongo를 사용하여 파이썬에서 HTTP 메소드 PATCH를 구현

는 DB가

dbname = "movies" 
#plugin = MongoPlugin(uri, db, json_mongo=True) 
connection = MongoClient(uri, 27017) 
db = connection[dbname] 
db[dbname].insert(movies) 

movies = [{'title' : 'Blade Runner', 'rel_date' : '25 June 1982', 'prod_company' : 'Warner Bros.'}, 
     {'title': 'Snatch', 'rel_date': '19 January 2001', 'prod_company': 'Columbia Pictures'}, 
     {'title': 'The Godfather', 'rel_date': '24 March 1972', 'prod_company': 'Paramount Pictures'}, 
     {"title": "Fight Club", "rel_date": "21 September 1999", "prod_company": "20th Century Fox" }] 

그리고 여기 내 방법은 내가 우체부를 사용 PATCH에게

@app.route('/<name>', method='PATCH') 
def update_movie(name): 
    data = request.body.read_line() 
    if not data: 
     abort(404, 'No data received') 
    entity = json.loads(data) 
    db[dbname].update({'title' : name}, {'$set':entity}}) # edited 
    return {'Message' : 'The movie was updated'} 

을 처리하는 것입니다 내가 DB에 넣어 데이터를 설정하는 방법입니다 요청을 보냅니다. 내가이

http://localhost:8080/test 
passing: {"rel_date": "new_date"} 

같은 PATCH 요청을 보내는 경우 나는 오류를 얻을 : 405 방법은 허용되지 않음 : 요청 된 URL에 오류가 발생했습니다. 내가 뭘 잘못하고 있는지 알아내는 데 도움주세요. 감사합니다. .

+1

아마도 '패치'가 활성화되지 않은 업스트림 프록시를 통해 제공되고 있습니까? 병 자체가 허용하는 것으로 보입니다 (https://bottlepy.org/docs/dev/api.html#bottle.Bottle.patch). 귀하의 업데이트 코드가 잘못되어'entity'가 이미 유효한 dict으로 나오고 간단하게 나오기 때문에'db [dbname] .upupate ({ 'title': name}, { '$ set': entity}) ' 내용에있는 모든 경로를 덮어 쓰려고했습니다. –

+0

@ NeeLunn 답장을 보내 주셔서 감사합니다. 그래서 문제가 코드 외부에 있다고 말할 수 있습니까? 내가 너를 정확하게 이해 했니? 코드 수정에 감사드립니다. – Nouxau

+1

그것이 유효한 의미로 보입니다. 문서화 된 API가 메소드가 지원된다고 말하면, 오류를보고 할 수있는 유일한 것은 구현 된 요청 핸들러의 "업스트림"이어야합니다. 따라서 nginx 나 다른 프록시 메소드 또는 실제로 WSGI 컨테이너를 사용하고 있다면 아마도 거기에 있어야합니다. 필수 "hello world"로 테스트 해보십시오. –

답변

0

오류를 발견했습니다. 내 실수가 제대로 설정되지 않아 405가 발생했습니다. 기능 내부에서 일부 오류가 수정되었습니다.

@route('/movies/<name>', method='PATCH') 
def update_movie(name): 

    data = request.json 
    if not data: 
     abort(400, 'No data received') 

    try: 
     db[dbname].update_one({'title' : name}, {'$set': data}) 
    except Exception as e: 
     print (e) 

    return {'Message' : 'The movie was updated'}