网站内容管理系统上传图片(Flask-Admin后台管理-admin扩展访问)

优采云 发布时间: 2022-02-09 05:23

  网站内容管理系统上传图片(Flask-Admin后台管理-admin扩展访问)

  Flask-Admin后台管理

  Flask-Admin 是一个易于使用的 Flask 扩展,可让您轻松快速地向 Flask 应用程序添加管理界面。

  开始

  先用 pip 安装 flask-admin 扩展

  

pip install flask-admin

  初始化

  

from flask import Flask

from flask_admin import Admin, BaseView, expose

app = Flask(__name__)

admin = Admin(app[,name=u'后台管理系统'])

app.run()

  访问:5000/admin/可以看到一个简单的首页,其中name是自定义的系统名称,会显示在导航栏上

  

  背景

  添加视图

  添加到之前的代码

  

class MyView(BaseView):

#这里类似于app.route(),处理url请求

@expose('/')

def index(self):

return self.render('index.html')

admin.add_view(MyView(name=u'Hello'))

  在templates下编写模板文件index.html

  

{% extends 'admin/master.html' %} #为了保持一致,继承admin/master.html模板

{% block body %}

欢迎来到后台管理系统!

{% endblock %}

  这里使用的模板语言是Jinjia2,见Jinjia2文档

  添加数据库模型视图

  这是 Flask-Admin 的一个非常方便的部分。它只需要少量的代码来实现数据库模型的管理视图。这里使用 Flask-SQLAlchemy 作为 ORM 后端

  

from flask_admin.contrib.sqla import ModelView

# 在这里初始化Flask Flask-SQLAlchemy Flask-Admin

admin.add_view(ModelView(User, db.session))

  

  模型视图示例

  注意:右上角添加管理员登录

  但网页默认显示为英文,需要中文处理。 Flask-Admin自带国际化,所以中文显示也很方便

  使用 Flask-BabelEx 进行国际化

  

from flask_babelex import Babel

app = Flask(__name__)

babel = Babel(app)

app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

  然后运行,中文显示很方便,换成其他语言也很方便

  

  中文显示

  自定义数据库模型视图

  

class UserView(ModelView):

#这三个变量定义管理员是否可以增删改,默认为True

can_delete = False

can_edit = False

can_create = False

#这里是为了自定义显示的column名字

column_labels = dict(

username=u'用户名',

)

#如果不想显示某些字段,可以重载这个变量

column_exclude_list = (

'password_hash',

)

# 只需把自己写的处理模型的视图加进去就行了,category是可选的目录

admin.add_view(UserView(User, db.session, name=u'信息', category=u'用户'))

  查看 flask_admin.model 文档了解更多可定制选项

  使用 Flask-Login 进行身份验证

  管理员系统无法打开,需要进行身份验证。我在这里使用 Flask-Login 进行身份验证

  这个有点复杂,首先要自定义templates下的模板文件index.html

  使用带有 CSRF 令牌的安全表单实现管理员登录

  

{% extends 'admin/master.html' %}

{% block body %}

{{ super() }}

{% if current_user.is_authenticated %}

欢迎来到后台管理系统!

{% else %}

{{ form.hidden_tag() if form.hidden_tag }}

{% for f in form if f.type != 'CSRFTokenField' %}

{{ f.label }}

{{ f }}

{% if f.errors %}

{% for e in f.errors %}

{{ e }}

{% endfor %}

{% endif %}

{% endfor %}

登陆

{{ link | safe }}

{% endif %}

{% endblock body %}

  处理管理员登录

  

#这里的fields和validators是用的Flask-WTForm

from wtforms import fields, validators

class LoginForm(FlaskForm):

login = fields.StringField(label=u'管理员账号', validators=[validators.required()])

password = fields.PasswordField(label=u'密码', validators=[validators.required()])

def validate_login(self, field):

user = self.get_user()

if user is None:

raise validators.ValidationError(u'账号不存在')

#这里密码不能明文存储,我用sha256_crypt加密

if not sha256_crypt.verify(self.password.data, user.password):

raise validators.ValidationError(u'密码错误')

def get_user(self):

#AdminUser是存储管理员用户密码的表

return db.session.query(AdminUser).filter_by(login=self.login.data).first()

  安装烧瓶登录

  

pip install flask-login

  初始化,只需调用init_login()函数

  

from flask_login import current_user, login_user, logout_user, LoginManager

def init_login():

login_manager = LoginManager()

login_manager.init_app(app)

@login_manager.user_loader

def load_user(user_id):

return db.session.query(AdminUser).get(user_id)

  然后在需要管理员权限才能查看的视图中添加代码

  

#决定身份验证可见

def is_accessible(self):

return current_user.is_authenticated

  管理上传的文件和图片

  要上传文件,只需调用 FileAdmin

  

from flask_admin.contrib.fileadmin import FileAdmin

import os.path as op

file_path = op.join(op.dirname(__file__), 'static')

admin.add_view(FileAdmin(file_path, '/static/', name='文件'))

  图片上传

  

#假设pics为需要上传图片的字段

form_extra_fields = {

'pics': upload.ImageUploadField(label=u图片',

base_path=file_path),

}

  

  上传图片

  参考

  Flask-Admin 文档快速入门

  Flask-Admin中文教程

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线