2017-09-04 2 views
0

Ich habe einen CRUD-Endpunkt mit Flask erstellt, aber wenn ich versuche, Daten abzurufen, erhalte ich einen 404-Fehler. Ich habe versucht, mit 'http://127.0.0.1:5002/albums/beck//' und 'http://127.0.0.1:5002/albums/beck' auf diesen Endpunkt zuzugreifen, aber immer noch einen 404. Da ich 'Beck' als Künstlername angegeben habe, dachte ich, die Methode get würde gut laufen. Ich denke, ich habe die Ressource falsch hinzugefügt.Problem beim Zugriff auf den CRUD-Endpunkt in Flask

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 

erstellen API Routen

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') 

Antwort

1

Diese Zeile:

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

Es einen Weg zum Flask Router fügt hinzu, dass es /albums/<artist_name>/<album_name>/<album_name_new> erwarten macht, während Sie versuchen, /albums/<artist_name> zu beantragen, was zu nichts passt.

Eine schnelle Lösung für Sie wäre:

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

Allerdings könnte man stattdessen Abfrage-String-Parameter für Ihre Suche Schnittstelle unterstützen möchten, so dass Anfragen mehr so ​​aussehen:

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

zu tue das, die documentation for Flask-RESTful reqparse wäre nützlich.

+0

@ birrree Ist es möglich, eine andere Anzahl von Argumenten für get, post, put und delete zu haben? oder ist das, wo reqarse hereinkommt? – PanczerTank

+1

@PanczerTank für verschiedene Anzahlen von Argumenten für Anfragen wie "get", können Sie 'reqparse' verwenden (obwohl es veraltet ist, aber Sie es noch oder etwas wie Marshmallow verwenden können). Für andere Dinge können Sie neue Endpunkte erstellen und sie an dieselbe Klasse binden. Flask-RESTful sieht aus wie du solltest nur einen Endpunkt an eine Klasse binden, aber das ist nicht der Fall. Sie können dieselbe Klasse abhängig von Ihren Anforderungen an mehrere Ressourcen anhängen. – birryree

Verwandte Themen