使用GET的FLASK RESTful API获取特定的ID并返回201使用Python

问题描述:

我试图使用GET方法得到todo_ID。我在使用sqlalchemy方面仍然很陌生,而且我尝试过的大多数事情都告诉我sqlalchemy不使用它们。另外,有人可以告诉我如何使用HEAD,我想我的方法返回http状态,我有点尝试使用它们并导入渲染模板,但是当我尝试使用它时,它说它不知道它们是什么。使用GET的FLASK RESTful API获取特定的ID并返回201使用Python

这是我在寻找一个教程,并尝试进行更改

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

我认为需要数据库中的所有待办事项对象。 – Muba

+0

是的,如果你想通过id过滤,你可以使用Todo.query.get(id)。这将基于ID和ID的查询应该是唯一的,因此只返回一条记录。 –

如果您想查询通过主键和只返回一个记录待办事项您可以使用:

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

它表示main_.todo对象不是json可序列化 – Muba

+0

您是对的。我更新了答案。 –

+0

非常感谢你!有没有一个原因,为什么输出以userid开头? – Muba

不知道我理解你的问题,如果你的目的是要返回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