6

假设我MethodView看起来像这样:

from flask import jsonify, request, redirect, flash, views, url_for
from models import Provider

class ProviderAPI(views.MethodView):

    def get(self, provider_id):
        if provider_id is not None:
            provs = [Provider.objects.get_by_id(provider_id)]
        else:
            provs = Provider.objects.all()
        return jsonify(dict(objects=[x.attributes_dict for x in provs]))

    def post(self):
        data = request.form.to_dict()
        data['index'] = request.form.getlist('index')
        if data:
            obj = Provider(**data)
            if obj.is_valid():
                obj.save()

                flash('%s created' % obj, )

                return redirect(url_for(
                    'provider',
                    provider_id=obj.id,
                    )
                )
            else:
                return jsonify(obj.errors)

    def put(self, provider_id):
        pass

    def delete(self, provider_id):
        pass

这将使用这个已知的片段注册:

def register_api(view, endpoint, url, pk='id', pk_type='int'):
    """
    Helper for the API boilerplate, `view` must inherit from MethodView 

    register_api(UserAPI, 'user', '/user/', pk='provider_id')
    """
    view_func = view.as_view(endpoint)

    app.add_url_rule(url, defaults={pk: None},
                     view_func=view_func, methods=['GET',])
    app.add_url_rule(url, view_func=view_func, methods=['POST',])
    app.add_url_rule('%s<%s:%s>' % (url, pk_type, pk), view_func=view_func,
                     methods=['GET', 'PUT', 'DELETE'])

问题是,在post成功之后,它被重定向了get函数,但是通过POST调用并引发了Method Not Allowed.

127.0.0.1 - - [08/Aug/2012 12:35:21] "POST /provider/ HTTP/1.1" 302 -
127.0.0.1 - - [08/Aug/2012 12:35:21] "POST /provider/44 HTTP/1.0" 405 -

有没有办法告诉redirect使用GET呼叫代替?

4

1 回答 1

2

看起来可以使用与前一个请求相同的请求方法进行 302 重定向。但是,303 重定向应始终使用 GET ( source )。

重定向功能可以采用状态码。尝试这个:

            return redirect(url_for(
                'provider',
                provider_id=obj.id,
                ),
                code=303
            )

编辑:类似的讨论:重定向到 Flask 中的 URL

于 2013-05-23T04:59:36.217 回答