【问题标题】:Can't seem to figure out how to use response headers in Flask似乎无法弄清楚如何在 Flask 中使用响应标头
【发布时间】:2017-03-01 08:31:41
【问题描述】:

嘿,伙计们,我知道为什么我的代码不起作用。我忘记了大部分关于响应标头以及如何使用它的东西,而且我不知道何时使用 dict 和 tuple 等。

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。

【问题讨论】:

  • 你到底想做什么?返回一个 JSON 对象?
  • 我正在尝试返回特定待办事项的所有详细信息,并在使用 curl 语句时使用响应标头向其添加更多信息。我把它扔进一个物体里,希望它能起作用。它曾经在某一时刻工作,但现在却不行了。
  • 我什么都不想要。当我运行 curl 语句时,我只想显示该位置,因为它通常不显示。

标签: python flask header response


【解决方案1】:

假设您希望以 JSON 格式返回 todo 对象;下面是使用 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}

【讨论】:

  • 我认为他可以使用 jsonify 而不是 make_response。 Jsonify 自动设置响应对象的 content-type 头
  • @megadarkfriend 是否可以使用 jsonify 设置额外的标头?
  • 我不这么认为。使用 jsonify 时,内容类型标头设置为 application/json。以下是更多参考文档:flask.pocoo.org/docs/0.12/api/#flask.json.jsonify
  • 看起来@tony 想将位置标头添加到响应中,因此 jsonify 在这里不起作用。
  • 我很困惑,我又在看我的代码了。对象没有属性 status_code 的错误是因为我使用响应对象来获取 Todo 详细信息并且它告诉我 todo 表中没有 status_code 这样的东西吗?
猜你喜欢
  • 2011-07-08
  • 2021-06-04
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2014-05-11
  • 2016-03-12
  • 2014-05-19
  • 2012-05-01
相关资源
最近更新 更多