I started off using Django building web apps, and now I'm depending on Flask for most of my projects. I think the decorator @app.route in Flask is straightforward, but once the file grows bigger and bigger, the "django style" url mapping seems to be more favorable. 
To accomplish this, I used a work around to mimic Django's url mapping, but I'm not sure if this is a good practice and worried that there might be some performance issue.
Here is a minimal example:
# project/views.py
def index():
    print "hello index!"
def get_users():
    print "hello users!"
# project/urls.py
from project import views
# store url mapping arguments in a list of tuples following this pattern:
# (endpoint, methods, viewfunc)
urls = [
  ('/', ['GET'], views.index),
  ('/users', ['GET'], views.get_users)
]
Then finally:
# project/__init__.py
from flask import Flask
from project.urls import urls
app = Flask(__name__)
# Loop through the urls list to add all url rules to app
for url in urls:
    app.add_url_rule(url[0], methods=url[1], view_func=url[2])
This structure works with no problems and I see a cleaner organization of my code base, but somehow I feel unconfident having a loop inside my __init__.py. 
Does anyone have a better solution?
You can set up an application factory:
def create_app(name):
    app = Flask(name)
    for url in urls:
        app.add_url_rule(url[0], methods=url[1], view_func=url[2])
    return app
app = create_app(__name__)
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With