2017-03-01 14 views
-1

なぜ私のコードがうまくいかないのですか?私はレスポンスヘッダーとその使用方法についてのもののほとんどを忘れてしまったと私は、私は次のエラーを取得するこのコードを実行するときなどFlaskでレスポンスヘッダーを使用する方法がわからない

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

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

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 Todo.query.all()]) 

@app.route('/todo/<int:todo_ID>', methods = ['GET']) 
def get(todo_ID): 
    todo = Todo.query.get(todo_ID) 
    response 
    response['todo_ID']= todo.todo_ID 
    response['UserID'] = todo.UserID 
    response['details'] = todo.details 
    response.status_code = 200 
    response.headers['location'] = '/todo/{}'.format(todo.todo_ID) 
    return response 

辞書やタプルを使用する際に考え出すで吸います。

File "/home/muba/PycharmProjects/Work/Flaskapp.py", line 43, in get 
    response.status_code = 200 
AttributeError: 'dict' object has no attribute 'status_code' 
127.0.0.1 - - [01/Mar/2017 21:29:27] "GET /todo/1 HTTP/1.1" 500 - 

誰かが間違ったことを教えてもらえますか、何かチュートリアルを教えてもらえますか?私が理解できるのは、トップの私のレスポンスオブジェクトが何らかの理由でstatus_codeを使用できないということだけです。

+0

は正確に何をしようとしていますか? JSONオブジェクトを返しますか? –

+0

私は特定のtodoのすべての詳細を返そうとしており、curlステートメントを使用するときに応答ヘッダーを使用してさらに情報を追加しています。私はそれがうまくいくことを期待してオブジェクトに投げた。ある時点では働いていましたが、今はそうではありません。 – Muba

+0

私は何も戻したくありません。私がカールステートメントを実行するとき、私はちょうどそれが通常表示されないので、同様に表示される場所をしたい。 – Muba

答えて

0

todoオブジェクトをJSON形式で返すとします。以下は、JSONオブジェクトと余分なヘッダーを使ってレスポンスを構成する簡単な例です。

app.py

from flask import Flask, make_response 
import json 

app = Flask(__name__) 

    @app.route("/", methods=['GET']) 
    def index(): 

    todo = {'todo_ID': 1, 'UserID': 2, 'details': 'test'} 
    r = make_response((json.dumps(todo), 
         200, 
         {'Content-Type': 'application/json', 
         'location': '/todo/{}'.format(todo['todo_ID'])})) 
    return r 


if __name__ == "__main__": 
    app.run(debug=True) 

カール応答:

HTTP/1.0 200 OK 
Content-Type: application/json 
Location: http://localhost:5000/todo/1 
Content-Length: 46 
Server: Werkzeug/0.10.4 Python/2.7.13 
Date: Wed, 01 Mar 2017 09:09:11 GMT 


* Closing connection 0 
{"UserID": 2, "details": "test", "todo_ID": 1} 
+0

彼は私の意見ではmake_responseの代わりにjsonifyを使うことができます。 Jsonifyは自動的にレスポンスオブジェクトのcontent-typeヘッダを設定します – megadarkfriend

+0

@megadarkfriend jsonifyで余分なヘッダを設定することは可能ですか? –

+0

私はそう信じない。 jsonifyを使用する場合、content-typeヘッダーはapplication/jsonに設定されます。詳細はこちらのドキュメントを参照してください。http://flask.pocoo.org/docs/0.12/api/#flask.json.jsonify – megadarkfriend

関連する問題