我的主应用程序文件目前是一系列方法定义,每个定义都附加到一个路径。我的应用程序(main,admin,api)有3个不同的部分。我正在尝试将方法拆分为外部文件以便更好地维护,但我喜欢Flask在我的应用程序URL中使用路径装饰器的简单性。
我的一条路线目前看起来像这样:
# index.py
@application.route('/api/galleries')
def get_galleries():
galleries = {
"galleries": # get gallery objects here
}
return json.dumps(galleries)
但是我想将get_galleries方法解压缩到包含我的API方法的文件中:
import api
@application.route('/api/galleries')
api.get_galleries():
问题在于,当我这样做时,我收到错误。这是可能的,如果可以,我该怎么做?
答案 0 :(得分:18)
如同其他评论中所述,您可以致电app.route('/')(api.view_home())
或使用Flask的app.add_url_rule()
http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule
Flask的@app.route()
代码:
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
您可以执行以下操作:
## urls.py
from application import app, views
app.add_url_rule('/', 'home', view_func=views.home)
app.add_url_rule('/user/<username>', 'user', view_func=views.user)
然后:
## views.py
from flask import request, render_template, flash, url_for, redirect
def home():
render_template('home.html')
def user(username):
return render_template('user.html', username=username)
我使用的方法是为了解决问题。在其自己的文件中定义所有urls
,然后在运行import urls
的{{1}}中定义__init__.py
在你的情况下:
app.run()
API / urls.py
|-- app/
|-- __init__.py (where app/application is created and ran)
|-- api/
| |-- urls.py
| `-- views.py
API / views.py
from application import app
import api.views
app.add_url_rule('/call/<call>', 'call', view_func=api.views.call)
答案 1 :(得分:1)
装饰器只是功能,所以你可以这样做:
import api
api.get_galleries = application.route(api.get_galleries, '/api/galleries')
答案 2 :(得分:0)
装饰者只是一个特殊的功能。
routed_galleries = application.route('/api/galleries')(api.get_galleries)
事实上,根据装饰者的不同,你可能根本不需要保留结果。
application.route('/api/galleries')(api.get_galleries)
答案 3 :(得分:0)
我认为你不能以这种方式装饰方法。但我认为不是以正常方式使用装饰器,而是可以创建一个回调来手动装饰它。
def wrap_api(cls, rt):
return application.route(rt)(cls)
然后你可以像这样使用它:
import api
galleries = wrap_api(api.get_galleries(), '/api/galleries')