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;
}
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
add a comment |
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
add a comment |
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
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
python flask
edited Jan 3 at 15:14
v25
asked Jan 3 at 14:47
v25v25
472311
472311
add a comment |
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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