POST-then-redirect and MethodViews

Let's say I have a MethodView that looks like this:

 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 

This is recorded in this famous fragment:

 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']) 

The fact is that after successful completion of post it is redirected by the get function, but with a call to post , and it raises 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 - 

Is there a way to tell redirect use a get call instead?

+6
source share
1 answer

It seems that redirection 302 can be performed using the same request method as the previous request. However, redirect 303 should always use a GET ( source ).

The redirection function can accept a status code. Try the following:

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

Edit: Similar discussion: Redirecting to a URL in a flash

+2
source

Source: https://habr.com/ru/post/922375/


All Articles