Flask路由,多个路由功能

时间:2017-02-18 06:39:27

标签: python python-2.7 flask python-decorators

因此,要实现一个无缝的Web应用程序,不要在每个新视图上重新加载页面变化是非常重要的。要做到这一点,我正在使用socketio,并在后端转换为base64,因此html不会在传输中丢失。

但是,当用户直接访问网址时,我希望他们能够看到同一页面,就好像用户在索引页面上点击链接,然后通过socketio加载它一样显示页面。 (索引→页面)

这是socketio路由装饰器类inspired by a blog post by Ainsley Jones

class socketio_route:
    def __init__(self):
        self.routes = {}

    def route(self, rule):
        if rule[0] == '/':
            rule = rule[1::]
        def decorator(f):
            self.routes[rule] = f
            return f
        return decorator

    def serve(self, path):
        view_func = self.routes.get(path)
        if view_func:
            return view_func(False)

然后与标准@app.route('/')烧瓶装饰器一起使用。

@app.route('/branches')
@skt.route('/branches')
def route_branches(fullpage=True):
    values = {"data": {'branch': 'master'}}
    page = render_template('default.html', **values)

    if fullpage == False:
        socketio.emit('page', base64.b64encode(page), namespace='/page')
    else:
        return render_template('index.html', socket_preload_content=page)

如果通过socketio访问 裸骨 页面,则返回 裸骨 页面,以及整页(render_template的初始render_template )如果是通过默认方法访问的话;直接

我正在使用flask_socketio来处理所有事情。

问题

所以,我的问题是,是否可以将所有这些整合到一个路径装饰器中,或者扩展现有的烧瓶@app.route()装饰器?

自定义路线可能是这样的吗?

@CUSTOM.route('/branches')
def branches():
    values = {"data": {'branch': 'master'}}
    return render_template('default.html', **values)

将返回

socketio.emit('page', base64.b64encode(OUTPUT_FROM_ABOVE), namespace='/page')

render_template('index.html', socket_preload_content=OUTPUT_FROM_ABOVE)

取决于它的调用方式。

我查看了烧瓶的app.add_url_rule,但对于如何将其整合到现有的socketio_route装饰器类中感到困惑。

有人可以建议我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

所以为了解决这个问题,我确实最终使用了烧瓶的app.add_url_rule

socketio_route有点不同,主要是因为它直接发出了一个页面。

class socketio_route:
    def __init__(self):
        self.routes = {}

    def route(self, rule, f):
        if rule[0] == '/':
            rule = rule[1::]
        self.routes[rule] = f

    def serve(self, path):
        view_func = self.routes.get(path)
        if view_func:
            socketio.emit('page', base64.b64encode(view_func(fullpage=False)), namespace='/page')

skt = socketio_route()

我写的自定义装饰器添加了socketio_routeapp的路径。

def dual_route(rule):
    def decorator(f):
        @wraps(f)
        def decorated_function(fullpage=True, *args, **kwargs):
            if fullpage == False:
                return f(*args, **kwargs)
            else:
                return render_template('index.html', socket_preload_content=f(*args, **kwargs))
        app.add_url_rule(rule, decorated_function.__name__, decorated_function)
        skt.route(rule, decorated_function)
        return decorated_function
    return decorator

然后我可以通过以下方式调用它:

@dual_route('/branches')
def route_branches():
    values = {"data": {'branch': 'master'}}
    return render_template('default.html', **values)