13

我的主应用程序文件目前是一系列方法定义,每个都附加到一个路由。我的应用程序有 3 个不同的部分(main、admin、api)。我正在尝试将方法拆分为外部文件以便更好地维护,但我喜欢 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():

问题是,当我这样做时,我得到了一个错误。这是可能的,如果可以,我该怎么做?

4

4 回答 4

27

如另一条评论中所述,您可以调用app.route('/')(api.view_home())或使用 Flask 的app.add_url_rule() http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule

烧瓶的@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在你__init__.py运行的文件中app.run()

在你的情况下:

|-- app/
|-- __init__.py (where app/application is created and ran)
|-- api/
|   |-- urls.py
|   `-- views.py

api/urls.py

from application import app

import api.views

app.add_url_rule('/call/<call>', 'call', view_func=api.views.call)

api/views.py

from flask import render_template

def call(call):
    # do api call code.
于 2013-06-16T02:24:00.930 回答
1

装饰器只是一个特殊的功能。

routed_galleries = application.route('/api/galleries')(api.get_galleries)

事实上,根据装饰器的作用,您可能根本不需要保留结果。

application.route('/api/galleries')(api.get_galleries)
于 2013-06-16T02:21:06.750 回答
1

装饰器只是函数,所以你可以这样做:

import api
api.get_galleries = application.route(api.get_galleries, '/api/galleries')
于 2013-06-16T02:27:25.753 回答
0

我认为您不能以这种方式装饰方法。但我想你可以创建一个回调来手动装饰它,而不是以正常方式使用装饰器。

def wrap_api(cls, rt):
  return application.route(rt)(cls)

然后你可以像这样使用它:

import api
galleries = wrap_api(api.get_galleries(), '/api/galleries')
于 2013-06-16T02:26:20.983 回答