#python #flask #flask-restful
Вопрос:
В настоящее время я работаю над проектом flask restful, который требует, чтобы я перенаправлял запрос с одной конечной точки на другую конечную точку, и я использую flask.redirect
для этого. Однако flask.redirect
не работает, когда конечная точка имеет marshal_with
. У кого-нибудь есть какие-либо идеи о том, как заставить flask.redirect
работать с marshal_with
?
Вот пример кода:
import flask
from flask import Flask
from flask_restx import Model, Resource, fields, Namespace, abort, Api
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
api = Api(app, version='1.0', title='TodoMVC API',
description='A simple TodoMVC API',
)
ns = Namespace('todos', description='TODO operations')
ns2 = Namespace('todos2', description='TODO operations')
todo = Model('todo', {
'id': fields.Integer(required=True, description='The task unique identifier'),
'task': fields.String(required=True, description='The task details'),
'description': fields.String(required=True, description='Put some description here')
})
response = Model('response', {
'id': fields.Integer,
'task': fields.String
})
ns.models[todo.name] = todo
ns.models[response.name] = response
todo2 = Model('todo2', {
'task': fields.String(required=True, description='The task details'),
'todo_description': fields.String(required=True, description='Put some description here')
})
response2 = Model('response2', {
'id': fields.Integer,
'task': fields.String
})
ns2.models[todo2.name] = todo2
ns2.models[response2.name] = response
api.add_namespace(ns)
api.add_namespace(ns2)
@ns2.route('/<int:id>')
@ns2.response(404, 'Todo not found')
class Todo(Resource):
'''Show a single todo item and lets you delete them'''
@ns2.doc('get_todo')
def get(self, id):
'''Fetch a given resource'''
return "get todo 2"
@ns2.expect(todo2)
@ns2.marshal_with(response)
def post(self, id):
'''Update a task given its identifier'''
if id == 1:
redirection = flask.redirect(flask.url_for('todos_todo_list', _method='POST'), code=307)
return redirection
return {"id": "dummy id", "task": "some dummy task here"}
@ns.route('/')
class TodoList(Resource):
'''Shows a list of all todos, and lets you POST to add new tasks'''
@ns.doc('list_todos')
def get(self):
'''List all tasks'''
return "get todo list"
@ns.doc('create_todo')
@ns2.expect(todo)
@ns.marshal_with(response)
def post(self):
'''Create a new task'''
payload = ns.payload
return {"id": payload.get("id"), "task": payload.get("task")}
if __name__ == '__main__':
app.run(debug=True)