Activate FlaskLimiter on a blueprint with pluggable view





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I am trying to register a blueprint in my app factory function, using a pluggable view, whilst passing in the Flask Limiter instance like so:



limiter = Limiter(app, key_func=get_remote_address)

the_api = Blueprint('the_api', __name__)

the_api.add_url_rule('/pluggable',
view_func=Pluggable.as_view('pluggable', limiter))

app.register_blueprint(the_api)


As per the limiter docs, I should be able to decorate the class as follows:



class Pluggable(MethodView):

decorators = [self.limiter.limit("1 per minute")]

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


However I found this didn't work when limiter is passed in via the init function:



decorators = [self.limiter.limit("1 per minute")]
NameError: name 'self' is not defined


So I tried changing this to:



def __init__ (self, limiter):
self.decorators = [limiter.limit("1/minute")]


This doesn't throw an exception, but nor does it apply the limit to the endpoint (unless I've missed something).



To approach this in another manner, I could go by the Flask Docs which suggests using the following format which would be inside my app factory function:



# DOC example
view = user_required(UserAPI.as_view('users'))
app.add_url_rule('/users/', view_func=view)


However I find this doesn't work as I also need to call the method Limiter.limit.



view = Pluggable.as_view('pluggable')
limited_view = limiter(view).limit('1 per minute')
the_api.add_url_rule('/pluggable', view_func=limited_view)


which generates the error:



limited = limiter(view).limit('1 per minute')
TypeError: 'Limiter' object is not callable


What is the correct way to achieve this? Should I be creating the limiter within the MethodView.__init__ function for every pluggable view. This sounds in-efficient, plus I'd like to define my rate limits in or around the add_url_rule function.










share|improve this question































    0















    I am trying to register a blueprint in my app factory function, using a pluggable view, whilst passing in the Flask Limiter instance like so:



    limiter = Limiter(app, key_func=get_remote_address)

    the_api = Blueprint('the_api', __name__)

    the_api.add_url_rule('/pluggable',
    view_func=Pluggable.as_view('pluggable', limiter))

    app.register_blueprint(the_api)


    As per the limiter docs, I should be able to decorate the class as follows:



    class Pluggable(MethodView):

    decorators = [self.limiter.limit("1 per minute")]

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


    However I found this didn't work when limiter is passed in via the init function:



    decorators = [self.limiter.limit("1 per minute")]
    NameError: name 'self' is not defined


    So I tried changing this to:



    def __init__ (self, limiter):
    self.decorators = [limiter.limit("1/minute")]


    This doesn't throw an exception, but nor does it apply the limit to the endpoint (unless I've missed something).



    To approach this in another manner, I could go by the Flask Docs which suggests using the following format which would be inside my app factory function:



    # DOC example
    view = user_required(UserAPI.as_view('users'))
    app.add_url_rule('/users/', view_func=view)


    However I find this doesn't work as I also need to call the method Limiter.limit.



    view = Pluggable.as_view('pluggable')
    limited_view = limiter(view).limit('1 per minute')
    the_api.add_url_rule('/pluggable', view_func=limited_view)


    which generates the error:



    limited = limiter(view).limit('1 per minute')
    TypeError: 'Limiter' object is not callable


    What is the correct way to achieve this? Should I be creating the limiter within the MethodView.__init__ function for every pluggable view. This sounds in-efficient, plus I'd like to define my rate limits in or around the add_url_rule function.










    share|improve this question



























      0












      0








      0








      I am trying to register a blueprint in my app factory function, using a pluggable view, whilst passing in the Flask Limiter instance like so:



      limiter = Limiter(app, key_func=get_remote_address)

      the_api = Blueprint('the_api', __name__)

      the_api.add_url_rule('/pluggable',
      view_func=Pluggable.as_view('pluggable', limiter))

      app.register_blueprint(the_api)


      As per the limiter docs, I should be able to decorate the class as follows:



      class Pluggable(MethodView):

      decorators = [self.limiter.limit("1 per minute")]

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


      However I found this didn't work when limiter is passed in via the init function:



      decorators = [self.limiter.limit("1 per minute")]
      NameError: name 'self' is not defined


      So I tried changing this to:



      def __init__ (self, limiter):
      self.decorators = [limiter.limit("1/minute")]


      This doesn't throw an exception, but nor does it apply the limit to the endpoint (unless I've missed something).



      To approach this in another manner, I could go by the Flask Docs which suggests using the following format which would be inside my app factory function:



      # DOC example
      view = user_required(UserAPI.as_view('users'))
      app.add_url_rule('/users/', view_func=view)


      However I find this doesn't work as I also need to call the method Limiter.limit.



      view = Pluggable.as_view('pluggable')
      limited_view = limiter(view).limit('1 per minute')
      the_api.add_url_rule('/pluggable', view_func=limited_view)


      which generates the error:



      limited = limiter(view).limit('1 per minute')
      TypeError: 'Limiter' object is not callable


      What is the correct way to achieve this? Should I be creating the limiter within the MethodView.__init__ function for every pluggable view. This sounds in-efficient, plus I'd like to define my rate limits in or around the add_url_rule function.










      share|improve this question
















      I am trying to register a blueprint in my app factory function, using a pluggable view, whilst passing in the Flask Limiter instance like so:



      limiter = Limiter(app, key_func=get_remote_address)

      the_api = Blueprint('the_api', __name__)

      the_api.add_url_rule('/pluggable',
      view_func=Pluggable.as_view('pluggable', limiter))

      app.register_blueprint(the_api)


      As per the limiter docs, I should be able to decorate the class as follows:



      class Pluggable(MethodView):

      decorators = [self.limiter.limit("1 per minute")]

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


      However I found this didn't work when limiter is passed in via the init function:



      decorators = [self.limiter.limit("1 per minute")]
      NameError: name 'self' is not defined


      So I tried changing this to:



      def __init__ (self, limiter):
      self.decorators = [limiter.limit("1/minute")]


      This doesn't throw an exception, but nor does it apply the limit to the endpoint (unless I've missed something).



      To approach this in another manner, I could go by the Flask Docs which suggests using the following format which would be inside my app factory function:



      # DOC example
      view = user_required(UserAPI.as_view('users'))
      app.add_url_rule('/users/', view_func=view)


      However I find this doesn't work as I also need to call the method Limiter.limit.



      view = Pluggable.as_view('pluggable')
      limited_view = limiter(view).limit('1 per minute')
      the_api.add_url_rule('/pluggable', view_func=limited_view)


      which generates the error:



      limited = limiter(view).limit('1 per minute')
      TypeError: 'Limiter' object is not callable


      What is the correct way to achieve this? Should I be creating the limiter within the MethodView.__init__ function for every pluggable view. This sounds in-efficient, plus I'd like to define my rate limits in or around the add_url_rule function.







      python flask






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jan 3 at 15:14







      v25

















      asked Jan 3 at 14:47









      v25v25

      472311




      472311
























          0






          active

          oldest

          votes












          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54024598%2factivate-flasklimiter-on-a-blueprint-with-pluggable-view%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54024598%2factivate-flasklimiter-on-a-blueprint-with-pluggable-view%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          MongoDB - Not Authorized To Execute Command

          in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

          Npm cannot find a required file even through it is in the searched directory