在Flask中返回HTTP状态码201

214
我们正在使用Flask开发一个API,我想知道有没有人知道如何返回HTTP 201响应?
对于诸如404这样的错误,我们可以调用:
from flask import abort
abort(404)

但是对于201,我得到了

LookupError:没有找到201的异常

我是否需要像文档中所述创建自己的异常?


35
返回'', 201 - Luc
2
这里的201并不是错误,而是表示成功的状态。 - Michael Murphy
12个回答

244

您可以使用 Response 返回任何 HTTP 状态码。

> from flask import Response
> return Response("{'a':'b'}", status=201, mimetype='application/json')

2
你可以将这段代码重写为 return {'a':'b'}, 201, {'Content-Type': 'application/json'},或者简单地写成 return {'a': 'b'}, 201 - Masood Khaari
2
@MasoodKhaari的方法实际上是正确的,因为它返回有效的JSON - 它看起来{'a':'b'}会自动转换为{"a":"b"}。双引号是正确的JSON。原始答案实际上返回单引号。 - antun

199

20
这需要 page.html 文件...... 它本身无法正常工作。 - Chris Stryczynski
1
对我来说,这种类型的错误处理(在IIS后面)只有当InvalidUsage是werkzeug.exceptions.HTTPException的子类时才有效,而不是一般的Exception。 - Gyula Sámuel Karli

49

32

由于缺少在返回语句中建议发送状态代码,如果您将其存储在某些变量中,则如下所示

notfound = 404
invalid = 403
ok = 200

并使用

return xyz, notfound

在处理时间时,请确保其类型为int而不是str。我曾遇到这个小问题,此外,以下是全球使用的状态码列表:http://www.w3.org/Protocols/HTTP/HTRESP.html

希望能有所帮助。


2
好的方式,但最好像模块一样访问它们,例如 status.NOT_FOUND - roshnet

15
在您的 Flask 代码中,尽可能频繁地指定 MIME 类型是理想的做法:
return html_page_str, 200, {'ContentType':'text/html'}

return json.dumps({'success':True}), 200, {'ContentType':'application/json'}

...etc


9
抄袭Luc这里的评论,但要返回空响应(如201),最简单的选项是在你的路由中使用以下返回语句。
return "", 201

例如:

    @app.route('/database', methods=["PUT"])
    def database():
        update_database(request)
        return "", 201

7

你也可以使用flask_api来发送响应

from flask_api import status

@app.route('/your-api/')
def empty_view(self):
    content = {'your content here'}
    return content, status.HTTP_201_CREATED

您可以在这里找到参考 http://www.flaskapi.org/api-guide/status-codes/


2
使用常量而非魔法数字,已为您点赞。 - Sergey Grechin

4

在我的情况下,我必须将上述内容结合起来才能使其正常工作。

return Response(json.dumps({'Error': 'Error in payload'}), 
status=422, 
mimetype="application/json")

2
您只需要在返回数据后添加您的状态码,就像这样:
from flask import Flask

app = Flask(__name__)
@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!',201
if __name__ == '__main__':
    app.run()

这是一个基础的Flask项目。启动后,当您请求http://127.0.0.1:5000/时,您会在网络浏览器控制台中收到状态代码201。请注意,保留了HTML标签,没有解释。

2
欢迎来到SO。这是一个十年前就已经被回答的问题!:o) - ingh.am

2

对于错误404,您可以

def post():
    #either pass or get error 
    post = Model.query.get_or_404()
    return jsonify(post.to_json())

为了成功的201

def new_post():
    post = Model.from_json(request.json)
    return jsonify(post.to_json()), 201, \
      {'Location': url_for('api.get_post', id=post.id, _external=True)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接