1.如何在一个app中启动多个dash_app
如果我们有多个界面,且每个界面想用不同的dash_app,那我们就需要将一个flask的server提供给多个dash_app,并且在app.py中进行合并。这个时候就需要使用应用路由调度了。
文档内容如下
也就是说我们需要用DispatcherMiddleware为多个dash_app提供服务。
具体使用如下:
app.py
import flask
from flask import Flask
from werkzeug.middleware.dispatcher import DispatcherMiddleware
import dash
import dash_table
import dash_core_components as dcc
import dash_html_components as html
from pages.server import server
from showimg import dash_app3
from showdata import dash_app2
#dash服务
dash_app1 = dash.Dash(__name__, server=server,external_stylesheets=external_stylesheets,url_base_pathname='/index/')
#蓝图注册
server.register_blueprint(showdata.data)
server.register_blueprint(showimg.img)
server.register_blueprint(downcsv.download)
server.register_blueprint(bymd.md)
markdown_text = '''
一些markdown内容
'''
dash_app1.layout = html.Div([
dcc.Markdown(children=markdown_text),
html.Div(html.Img(src='图片链接',height=600,width=900))
])
@server.route('/')
def hello():
return flask.redirect('/index')
app = DispatcherMiddleware(server, {
'/dash1': dash_app1.server,
'/dash2': dash_app2.server,
'/dash3': dash_app3.server,
})
if __name__ == '__main__':
server.run(port=3333,debug=True)
showdata.py
from flask import Blueprint
import flask
import dash
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import pymysql
from pages.server import server
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
data=Blueprint('data',__name__)
dash_app2= dash.Dash(__name__,server=server,external_stylesheets=external_stylesheets,url_base_pathname='/show_data/')
#从数据库读取数据
def get_data():
conn= pymysql.connect(host='localhost', user='root', password='xxxx', database='aml', charset='utf8')
sql= "SELECT * FROM movie_data"
df=pd.read_sql(sql=sql,con=conn)
return df
df=get_data()
# 创建表格
dash_app2.layout = html.Div([
html.Div(html.Center(html.Big('标题'))),
dcc.Markdown(children= '''一些markdown内容'''),
dash_table.DataTable(id='table',columns=[{"name": i, "id": i} for i in df.columns],data=df[:150].to_dict('records')),
])
@data.route('/data/')
def show():
return flask.redirect('/show_data')
类似于这样,就可以在flask中使用多个dash_app。dash_app可以直接在网页渲染markdown内容,这也是为什么我选择使用多个dash_app去构建不同页面。
注意:文档中from werkzeug.wsgi import DispatcherMiddleware
这样引入可能会找不到而报错,大多数选择是降低werkzeug的版本。而app.py中
from werkzeug.middleware.dispatcher import DispatcherMiddleware
这样引入应该不会出现问题
2.在dash回调函数中的重定向问题
当我在用dash构建界面时,发现如果在回调函数中去使用flask的重定向会报错,显示返回的是重定向的response而不是json序列,所以dash无法显示。所以可以看到路由是被更改了,但是页面没有跳转。需要我们再去点击一下路由才能跳转,这个问题我还一直没有解决。
3.在flask中整合flask-blogging
起初我是想flask整合一个能写markdown并保存的板块,搜索发现大多整合方式都是使用editor.md,然后再去渲染,但是那样就更类似于博客,而不是我的简单书写markdown需求,所以去github上面搜了一下,发现了flask-blogging。虽然这个也算一个博客,但是很轻便,整合起来也很快。运用他给的例子,自己配置一些url和数据库路径就可以直接使用,效果也还不错。
并且这个还可以实现图片的上传保存。
推荐大家可以整合去试试,不过如果需要功能更强大的话还需要自己再多丰富一下。
成果图
前端这块还是很不了解,所以主要是靠dash去充当前端页面显示部分,但是dash用不上或者说不太适合使用的时候,界面就显得太过单调。准备去试试用vue弥补前端这块。更多关于使用的部分可以去看看官网给的文档。