2016-12-24 69 views
1

我知道如何返回一個位置標題,其URL爲說「todo/1」,我必須在我的標題位置輸入一個,這樣我的代碼將如下所示POST方法。不過,我不知道如何根據todo_ID返回它,所以我不必手動輸入它。因此,例如它看起來像在燒瓶中獲取位置標題返回一個標識

response.headers['location'] = '/todo/todo_ID' 

但是,這將返回單詞todo_ID。無論如何,我可以返回已在網址中創建的實際todo_ID?

我看着這個問題,但不知道如果答案會幫助我。 How to return a relative URI Location header with Flask?

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

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

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 = ['POST']) #Uses POST method with same URL as GET method to add new information to Todo table. 
def create_todo(): 
    if not request.json: 
     abort(400) 
    response= jsonify() 
    todo = Todo(UserID = request.json["UserID"],details = request.json["details"]) 
    db.session.add(todo) 
    db.session.commit() 
    response.status_code = 201 
    response.headers['location'] = '/todo/1' 
    return response 
+0

你檢查你有'todo'? – furas

+0

不確定你的意思。如果你在討論URL中的/ todo,那麼它只是網址的一部分。 – Muba

+0

我在'todo = Todo(..)'中要求'todo'' – furas

回答

1

您需要的幾個步驟。

  1. db.session.commit()將刪除對象,使用沖洗第一
  2. response.headers [ '位置'] =「/todo/{}'.format(todo.todo_ID)
  3. 和然後db.session.commit()

這裏是整個代碼:

@app.route('/todo', methods = ['POST']) 
def create_todo(): 
    if not request.json: 
     abort(400) 
    response= jsonify() 
    todo = Todo(UserID = request.json["UserID"],details = request.json["details"]) 
    db.session.add(todo) 
    #db.session.commit() 
    db.session.flush() # will get id from database 
    response.status_code = 201 
    response.headers['location'] = '/todo/{}'.format(todo.todo_ID) 
    db.session.commit() # write to database 
    return response