2

私はHTMLフォームを持っています:

{% set delete_urls = url_for('store_add') ~ store_id ~ "?__METHOD_OVERRIDE__=DELETE" %}
<form action="{{delete_urls}}" name="delete" method="post" id="{{form_id}}" style="display:none">

とビューで:

class StoreAdd(MethodView):

    @login_required
    def delete(self,store_id):
        store_selected = request.args['store_id']

        qstr = "DELETE FROM store WHERE store_id=%d AND cust_id=%d"%(store_id,self.cust_id)
        h = pgexec(qstr,False,True)
        h.process()

        flash("deleted the store:%d"%(store_selected))
        return redirect(url_for('store_add'))

store_add = StoreAdd.as_view('store_add')
app.add_url_rule('/storeadd/',
                 defaults={'store_id': 0},
                 view_func=store_add,
                 methods=["GET","PUT"])
app.add_url_rule('/storeadd/',
                 view_func=store_add,
                 methods=["POST"])
app.add_url_rule('/storeadd/<int:store_id>',
                 view_func=store_add,
                 methods=['DELETE','PUT','GET'])

もちろん、ルーティングを実装しました。

from werkzeug import url_decode
from flask import flash

class MethodRewriteMiddleware(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        if 'METHOD_OVERRIDE' in environ.get('QUERY_STRING', ''):
            args = url_decode(environ['QUERY_STRING'])
            method = args.get('__METHOD_OVERRIDE__')
            if method in ['GET', 'POST', 'PUT', 'DELETE']:
                method = method.encode('ascii', 'replace')
            environ['REQUEST_METHOD'] = method
        return self.app(environ, start_response)

しかし、それでも削除フォームを送信しても、削除メソッドにアクセスできませんか?何が問題になっていますか?

編集:

削除の問題は次のとおりです。フォームを送信すると、URLに「POST」しようとしているようです。

/storeadd/13?__METHOD_OVERRIDE__=DELETE

ただし、POST URLルールでは、/storeaddのみが可能であるとされています。したがって、405ERRORページが表示されます。したがって、発生するはずのオーバーライドは発生しません。

4

1 に答える 1

0

このミドルウェアをフラスコ アプリケーションに適用しましたか?

app.wsgi_app = MethodRewriteMiddleware(app.wsgi_app)
于 2013-02-19T05:49:41.197 に答える