Flask-admin 使用总结
ModelView表管理,进入权限BaseView,expose自定义视图AdminIndexView进入权限FileAdmin文件管理fromflask_adminimportAdminfromflask_admin.contrib.fileadminimportFileAdminfromflask_adminimportAdmin,expose,BaseViewfromflask_admin.contrib.sqlaimportModelView#flask-admin国际化多语言fromflask_babeleximportBabelapp=Flask(__name__)babel=Babel(app)app.config['BABEL_DEFAULT_LOCALE']='zh_CN'#初始化admin后台admin=Admin(app,name='envmanager')#也可对后台首页进行自定义#后台标题修改为"导航栏",主页设置为welcome.html,后台url也修改admin=Admin(app,index_view=AdminIndexView(name='导航栏',template='welcome.html',url='/admin'))#或如下,其中MyAdminIndexView()继承AdminIndexView()admin=Admin(app,name='管理中心',index_view=MyAdminIndexView(),base_template='admin/my_master.html')#定义后台对表可增加、可编辑、可导出,可搜索,只显示指定的列classHashView(ModelView):create_modal=Trueedit_modal=Truecan_export=Truecolumn_searchable_list=['title']column_list=('id','title','timestamp','count','content'')column_labels={'id':'序号','title':'新闻标题','timestamp':'发布时间','count':'浏览次数','content':'新闻内容'}#或者下面这种写法column_labels=dict(username='用户名',)#不显示指定的列column_exclude_list=('password_hash',)#自定义视图#每个自定义视图必须提供一个@expose('/')的index方法,否则会报错classUserView(BaseView):@expose('/')defindex(self):returnself.render('admin/user.html')@expose('/user_manager')defuser_manager(self):returnself.render('admin/user.html')classMyNews(BaseView):@expose('/',methods=['GET','POST'])defindex(self):form=NameForm()returnself.render('postnews.html',form=form)#postnews.html在templates目录下#添加表管理、自定义视图admin.add_view(HashView(User,db.session,name='用户'))admin.add_view(HashView(Role,db.session,name='角色'))admin.add_view(HashView(Env,db.session,name='环境配置'))admin.add_view(UserView(name='user_manager'))admin.add_view(MyNews(name=u'发表新闻'))#category是可选的目录,且会自动添加上去admin.add_view(UserView(User,db.session,name='信息',category='用户管理'))#添加文件管理admin.add_view(FileAdmin(config_path,'/file/',name='ConfigFiles'))用Flask-Login做身份验证修改templates下的模板文件index.html,实现管理员登录带有CSRF令牌的安全表单{%extends'admin/master.html'%}{%blockbody%}{{super()}}{%ifcurrent_user.is_authenticated%}欢迎来到后台管理系统!{%else%}{{form.hidden_tag()ifform.hidden_tag}}{%forfinformiff.type!='CSRFTokenField'%}{{f.label}}{{f}}{%iff.errors%}{%foreinf.errors%}{{e}}{%endfor%}{%endif%}{%endfor%}登陆{{link|safe}}{%endif%}{%endblockbody%}定义登录表单fromwtformsimportfields,validatorsclassLoginForm(FlaskForm):login=fields.StringField(label='管理员账号',validators=[validators.required()])password=fields.PasswordField(label='密码',validators=[validators.required()])defvalidate_login(self,field):user=self.get_user()ifuserisNone:raisevalidators.ValidationError('账号不存在')#密码不能明文存储,用sha256_crypt加密ifnotsha256_crypt.verify(self.password.data,user.password):raisevalidators.ValidationError('密码错误')defget_user(self):#AdminUser是存储管理员用户密码的表returndb.session.query(AdminUser).filter_by(login=self.login.data).first()#安装flask-loginpipinstallflask-login#初始化,调用init_login()函数fromflask_loginimportcurrent_user,login_user,logout_user,LoginManagerdefinit_login():login_manager=LoginManager()login_manager.init_app(app)@login_manager.user_loaderdefload_user(user_id):returndb.session.query(AdminUser).get(user_id)#然后在需要管理员权限的才能看到的视图中添加代码#决定身份验证可见defis_accessible(self):returncurrent_user.is_authenticated图片上传#假设pics为需要上传图片的字段importos.pathasopdefthumb_name(filename):name,_=op.splitext(filename)returnsecure_filename('%s-thumb.jpg'%name)classMyForm(BaseForm):upload=ImageUploadField('File',thumbgen=prefix_name)importos.pathasopform_extra_fields={'pics':upload.ImageUploadField(label='图片',base_path=file_path),}可以使用url_for附带一个.前缀来获得局部视图的URL:fromflaskimporturl_forclassMyView(BaseView):@expose('/')defindex(self)#GetURLforthetestviewmethodurl=url_for('.test')returnself.render('index.html',url=url)@expose('/test/')deftest(self):returnself.render('test.html')建立只允许使用预定义值的名为status的列的表单:fromwtforms.fieldsimportSelectFieldclassMyView(ModelView):form_overrides=dict(status=SelectField)form_args=dict(#Passthechoicestothe`SelectField`status=dict(choices=[(0,'waiting'),(1,'in_progress'),(2,'finished')]))#添加redis控制台fromflask_admin.contribimportrediscliadmin.add_view(rediscli.RedisCli(Redis()))可扩展的模板:对应继承列表、创建、编辑页admin/model/list.htmladmin/model/create.htmladmin/model/edit.html例如:{%extends'admin/model/edit.html'%}{%blockbody%}MicroBlogEditView{{super()}}{%endblock%}使视图使用模板classMicroBlogModelView(ModelView):edit_template='microblog_edit.html'#create_template='microblog_create.html'#list_template='microblog_list.html'如果使用基础模板,则在基础函数中添加admin=Admin(app,base_template='microblog_master.html')防止csrf***保护#指定form_base_class参数fromflask_admin.formimportSecureFormfromflask_admin.contrib.sqlaimportModelViewclassCarAdmin(ModelView):form_base_class=SecureForm
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。