大型应用程序的 Django 风格的 Flask URL 模式
Django-styled Flask URL pattern for large application
我开始使用 Django 构建 Web 应用程序,现在我的大部分项目都依赖于 Flask。我觉得 Flask 中的装饰器 @app.route
很简单,但是一旦文件越来越大,"django style" url 映射似乎更有利。
为此,我使用了一种变通方法来模仿 Django 的 url 映射,但我不确定这是否是一个好的做法,并且担心可能会出现一些性能问题。
这是一个最小的例子:
# 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)
]
然后最后:
# 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])
这个结构没有问题,我看到我的代码库组织得更清晰,但不知何故,我对 __init__.py
中的 loop
感到不自信。
有没有人有更好的解决方案?
你可以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__)
我开始使用 Django 构建 Web 应用程序,现在我的大部分项目都依赖于 Flask。我觉得 Flask 中的装饰器 @app.route
很简单,但是一旦文件越来越大,"django style" url 映射似乎更有利。
为此,我使用了一种变通方法来模仿 Django 的 url 映射,但我不确定这是否是一个好的做法,并且担心可能会出现一些性能问题。
这是一个最小的例子:
# 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)
]
然后最后:
# 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])
这个结构没有问题,我看到我的代码库组织得更清晰,但不知何故,我对 __init__.py
中的 loop
感到不自信。
有没有人有更好的解决方案?
你可以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__)