python - Flask-Admin 自动上传并插入数据库

标签 python flask flask-sqlalchemy flask-admin

我的用户在 SQLAlchemy 中建模为:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    url_pic = Column(String(50), nullable=False)
    (...)

我想将用户添加到 Flask-Admin 中的数据库,这样当我创建用户时,我可以直接上传照片,目标 url 被解析并传递给数据库中的 url_pic 字段。

我已经可以添加用户和上传照片(详见 https://flask-admin.readthedocs.org/en/latest/quickstart/ ),但找不到任何关于如何在同一 View 中合并添加用户和上传照片的信息。

有什么线索吗?

最佳答案

您可以将模型修改为如下所示:

class User(Base):
   __tablename__ = 'users'
   id = Column(Integer, primary_key=True)
   url_pic = Column(String(50), nullable=False)
   pic = Column(LargeBinary, nullable=False)
   ...

现在您应该从 flask.ext.admin.contrib.sqla 继承 ModelView。然后将该子类的实例添加到 Admin 实例。以下源代码可以帮助您理解这一点。

from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin.form.upload import FileUploadField
from wtforms.validators import ValidationError
from flask.ext.admin import Admin
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask
import imghdr

app = Flask(__name__)
db = SQLAlchemy(app)

class UserAdminView(ModelView):

   def picture_validation(form, field):
      if field.data:
         filename = field.data.filename
         if filename[-4:] != '.jpg': 
            raise ValidationError('file must be .jpg')
         if imghdr.what(field.data) != 'jpeg':
            raise ValidationError('file must be a valid jpeg image.')
      field.data = field.data.stream.read()
      return True

   form_columns = ['id','url_pic', 'pic']
   column_labels = dict(id='ID', url_pic="Picture's URL", pic='Picture')

   def pic_formatter(view, context, model, name):
       return 'NULL' if len(getattr(model, name)) == 0 else 'a picture'

   column_formatters =  dict(pic=pic_formatter)
   form_overrides = dict(pic= FileUploadField)
   form_args = dict(pic=dict(validators=[picture_validation]))

admin = Admin(app)
admin.add_view(UserAdminView(User, db.session, category='Database Administration'))
...

您可以在此处找到ModelView 的文档:link here 我希望这可以帮助别人!

关于python - Flask-Admin 自动上传并插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19274555/

相关文章:

python - 更改 Flask-Admin View 的响应 header ?

python - Sqlalchemy 按列表中的字段过滤但保持原始顺序?

python - 基于 bool 数组求 numpy 数组的总和

python - 如何转置 3D np 数组中的每个元素

python - 检查两个 Python 正则表达式模式是否等效

python - 如何将枚举与 SQLAlchemy 和 Alembic 一起使用?

python - 插入时转换数据有问题吗?

python - 通过python检查查询是否成功运行

python - 客户端,Google Flex App Engine和Cloud SQL之间的高延迟

python - 在 Flask-SQLAlchemy 中添加 __init__() 方法