因此,要实现一个无缝的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
装饰器类中感到困惑。
有人可以建议我如何解决这个问题吗?
答案 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_route
和app
的路径。
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)