2017-09-04 16 views
0

我用Flask創建了一個CRUD端點,但是當我嘗試獲取數據時,收到一個404錯誤。我試圖用'http://127.0.0.1:5002/albums/beck//'和'http://127.0.0.1:5002/albums/beck'來訪問這個端點,但仍然得到了404。由於我提供了'beck'作爲藝術家名字,我認爲get方法可以正常運行。我認爲我錯誤地添加了資源。訪問Flask中訪問CRUD端點的問題

class Artistdetails(Resource): 
    def get(self, artist_name): 
     conn = db_connect.connect() 
     # Protect against SQL injection 
     restricted_char = "!=<>*0&|/\\" 
     for char in restricted_char: 
      artist_name = artist_name.replace(char, "") 
     query_db = conn.execute("SELECT DISTINCT album FROM album WHERE artist='{0}'".format(artist_name.title())) 
     result = jsonify({'artistAlbumList': [i[0] for i in query_db.cursor.fetchall()]}) 
     return result 

    def put(self, artist_name, album_name, album_name_new): 
     conn = db_connect.connect() 
     # Protect against SQL injection 
     restricted_char = "!=<>*0&|/\\" 
     for char in restricted_char: 
      artist_name = artist_name.replace(char, "") 
     query_db = conn.execute("UPDATE album SET album='{0}' WHERE artist='{1}' AND" 
           " album='{2}'".format(artist_name.title(), album_name.title(), album_name_new.title())) 
     result = jsonify({'putAlbumId': [i[0] for i in query_db.cursor.fetchall()]}) 
     return result, 201 

    def post(self, artist_name, album_name): 
     conn = db_connect.connect() 
     # Protect against SQL injection 
     restricted_char = "!=<>*0&|/\\" 
     for char in restricted_char: 
      artist_name = artist_name.replace(char, "") 
     query_db = conn.execute("INSERT INTO album (album, artist) VALUES" 
           " ({0},{1})".format(artist_name.title(), album_name.title())) 
     result = jsonify({'postAlbumId': [i[0] for i in query_db.cursor.fetchall()]}) 
     return result, 201 

    def delete(self, artist_name, album_name): 
     conn = db_connect.connect() 
     # Protect against SQL injection 
     restricted_char = "!=<>*0&|/\\" 
     for char in restricted_char: 
      artist_id = artist_name.replace(char, "") 
      album_id = album_name.replace(char, "") 
     query_db = conn.execute("DELETE FROM album WHERE" 
           " artist_id='{0}' AND album_id='{1}'".format(artist_name, album_name) 
           ) 
     result = jsonify({'deleteAlbumId': [i[0] for i in query_db.cursor.fetchall()]}) 
     return result, 204 

創建API路線

api.add_resource(Api, '/') 
api.add_resource(Albums, '/albums') 
api.add_resource(Artistdetails, '/albums/<string:artist_name>/<string:album_name>/<string:album_name_new>') 
api.add_resource(Genreyear, '/albums/yr') 
api.add_resource(Genrenum, '/albums/genre') 
api.add_resource(Artists, '/artists') 

回答

1

這條線:

api.add_resource(Artistdetails, 
    '/albums/<string:artist_name>/<string:album_name>/<string:album_name_new>') 

它增加了一個路徑瓶路由器,使得它期待/albums/<artist_name>/<album_name>/<album_name_new>,而你試圖請求/albums/<artist_name>,這不匹配任何東西。

速戰速決你會:

api.add_resource(Artistdetails, '/albums/<string:artist_name>') 

然而,你可能反而要支持查詢字符串參數爲您的搜索界面,使請求看起來更像是這樣的:

/albums?artist=<string>&album_name=<string> 

要那樣做,documentation for Flask-RESTful reqparse會很有用。

+0

@ birryree可以有不同數量的get,post,put和delete參數嗎?或者是reqparse進來的地方? – PanczerTank

+1

@PanczerTank爲'get'等請求提供了不同數量的參數,您可以使用'reqparse'(儘管它已被棄用,但您仍然可以使用它或類似棉花糖之類的東西)。對於其他事情,您可以創建新的端點並將它們綁定到同一個類。 Flask-RESTful類似你應該只將一個端點綁定到一個類,但那不是他的情況。根據您的需要,您可以將同一課程附加到多個資源。 – birryree