2016-11-30 9 views
0

GETメソッドを使用してtodo_IDを取得しようとしています。私はまだsqlalchemyを使っていて新しく、試したことのほとんどはsqlalchemyが使っていないことを伝えています。また、誰かがHEADの使い方を教えてもらえますか?私のメソッドがhttpステータスを返すようにしたい、それらを使って試してみました。そしてレンダリングテンプレートをインポートしましたが、私がそれらを使用しようとすると、FLESTK GETを使って特定のIDを取得し、Pythonを使用して201を返すRESTful API

は、このチュートリアルを見ている時、私の試みであると作りは

from flask import Flask, jsonify,json, request, render_template, abort 
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config.from_pyfile('Config.py') 
db = SQLAlchemy(app) 

class JsonModel(object): # Class for making objects JSON serializable 
    def as_dict(self): 
     return {c.name: getattr(self, c.name) for c in self.__table__.columns} 

class User(db.Model, JsonModel): # Class which is a model for the User table in the database 
    User_ID = db.Column(db.Integer, primary_key = True) 
    FirstName = db.Column(db.String(20)) 
    LastName = db.Column(db.String(20)) 

    def __init__(self,User_ID,FirstName, LastName): 
     self.User_ID = User_ID 
     self.FirstName = FirstName 
     self.LastName = LastName 

class Todo(db.Model, JsonModel): # Class which is a model for the Todo table in the database 
    todo_ID = db.Column(db.Integer, primary_key = True) 
    UserID = db.Column(db.Integer, db.ForeignKey("user.User_ID")) 
    details = db.Column(db.String(30)) 

    def __init__(self, UserID, details): 
     self.UserID = UserID 
     self.details = details 

@app.route('/todo', methods = ['GET']) # Uses GET method to return all information in the database. 
def index(): 
    return json.dumps([u.as_dict() for u in User.query.all()+Todo.query.all()]), 201 

@app.route('/todo/<int:todo_ID>', methods = ['GET']) 
def get(todo_ID): 
    query = Todo.query.get() 
    return {'todo': [dict(zip(tuple(query.keys()), i)) for i in query.cursor if i[1] == todo_ID]} 


@app.before_first_request #Creates everything before the first request. 
def startup(): 
    db.create_all() 

if __name__ == '__main__': 
    app.run() 

私の最新の試みだった変更:

@app.route('/todo/<int:todo_ID>', methods = ['GET']) 
def get(todo_ID): 
    query = Todo.query("select * from Todo") 
    return {'todo': [dict(zip(tuple(query.keys()), i)) for i in query.cursor if i[1] == todo_ID]} 

そして、私が手にエラーがこれです。

query = Todo.query("select * from Todo") 
TypeError: 'BaseQuery' object is not callable 
127.0.0.1 - - [30/Nov/2016 21:15:28] "GET /todo/1 HTTP/1.1" 500 - 
+0

**すべてのTodo **オブジェクトを選択している場合は、なぜ** Todo.query.all()**を呼び出さないのですか? –

+0

私はそれがデータベースのすべてのtodoオブジェクトを取ると思った。 – Muba

+0

idでフィルタリングしたい場合は、Todo.query.get(id)を使用できます。これはIDに基づいてクエリを実行し、IDは一意でなければならないので、1つのレコードだけを返します。 –

答えて

0

を使用することができます

from flask import jsonify 

@app.route('/todo/<int:todo_ID>', methods = ['GET']) 
def get(todo_ID): 
    response = {} 
    todo = Todo.query.get(todo_ID) 
    response['id'] = todo.id 
    response['user_id'] = todo.UserID 
    response['details'] = todo.details 
    response['status_code'] = 201 
    return jsonify(response) 
主キーのみによって藤堂はあなたが使用することができますのレコードを返します

Marshmallowを使用して、モデルごとにシリアライザを持たせることで、自動的にシリアライズすることができます。

+0

um main_.todoオブジェクトがjsonシリアライズ可能ではないと言っています – Muba

+0

あなたはそうです。私は答えを更新しました。 –

+0

ありがとうございます!出力が最初にuseridで始まる理由はありますか? – Muba

0

ない私はあなたの問題を理解して、あなたの意図が応答としてJSON出力を返すことで、あなたはステータスコードを制御したい場合は、照会したい場合、あなたは jsonify

from flask import jsonify 

@app.route('/todo/<int:todo_ID>', methods = ['GET']) 
def get(todo_ID): 
    query = Todo.query("select * from Todo") 
    response = {'todo': [dict(zip(tuple(query.keys()), i)) for i in query.cursor if i[1] == todo_ID]} 
    response = jsonify(response) 
    response.status_code = 201 
    return response 
+0

問題は、getメソッドが機能していないことです。 – Muba

関連する問題