flaskflask-limiter

How to import the same flask limiter in a structured flask app


I'm trying to organize my Flask app, as it's getting quite big in length at close to 1000 lines

I am trying to separate the REST API from my main app, by using the approach shown here: https://flask-restx.readthedocs.io/en/latest/scaling.html#multiple-apis-with-reusable-namespaces

What remains in my main.py is something like

from apiv1 import blueprint as api1

REST_API = Flask(__name__)
REST_API.wsgi_app = ProxyFix(REST_API.wsgi_app, x_for=1)
REST_API.register_blueprint(api1)

However in my app, I am using the flask limiter

# Very basic DOS prevention
try:
    limiter = Limiter(
        REST_API,
        key_func=get_remote_address,
        storage_uri="redis://localhost:6379/1",
        # storage_options={"connect_timeout": 30},
        strategy="fixed-window", # or "moving-window"
        default_limits=["90 per minute"]
    )
# Allow local workatation run
except:
    limiter = Limiter(
        REST_API,
        key_func=get_remote_address,
        default_limits=["90 per minute"]
    )

This is likewise placed in a decorator to my various API functions

    decorators = [limiter.limit("30/minute")]
    def post(self, server_id = ''):
       # [..]

Now that I am splitting my REST api from the same file that declaring my endpoints, I don't know how to pass its object. The REST_API var exists only in my main.py

How should I handle passing the limiter variable, or any other global objects for that matter?


Solution

  • I worked for a few hours yesterday but I finally understood the pythonic way to do this sort of thing.

    I just couldn't wrap my head around how imports function so I was struggling with questions like "how do I pass the variable during import" etc.

    Finally it clicked for me that I need to follow a "pull" method with my imports, instead of trying to push variables into them. I.e. I setup the center location in my package's __init__ which will import my logger module, and then my other modules will import THAT logger variable from there.

    enter image description here

    So in my app's __init__, I have

    from .limiter import limiter
    

    And in the app/apis/v1.py I have

    from .. import limiter
    

    And this seems to finally work. I don't know if this is the expected way, meaning to play with relative module paths, so if there;s a more elegant way, please let me know