SQLAlchemy模型中的进程字段(使用flask_sqlalchemy)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy模型中的进程字段(使用flask_sqlalchemy)相关的知识,希望对你有一定的参考价值。
我通过flask_sqlalchemy使用SQLAlchemy。模型从html表单接收输入。我希望这个输入被剥夺任何标签。我没有在赋值之前在代码中多次这样做,我认为在模型对象中以某种方式实现它可能会更好。
我能想到的可能性是:
- 派生自己的列类型
- 围绕列类型包装代理类
- 定义执行上述操作的装饰器类型
- 修改模型对象以截取分配
前三个解决方案似乎更优雅,但我不明白我需要如何实现这些。主要原因是我不明白SQLAlchemy究竟是如何从列变量中提取表结构和列类型的,以及如何处理对它们的赋值,特别是在访问through the flask_sqlalchemy class时。
我玩了上面列表中的最后一个选项,并提出了这个(部分)解决方案:
import bleach
class Example(db.Model):
__tablename__ = 'examples'
id = db.Column(db.Integer, primary_key=True)
field1 = db.Column(db.Text)
field2 = db.Column(db.String(64))
_bleach_columns = ('field1', 'field2')
def __init__(self, **kwargs):
if kwargs is not None:
for key in Example._bleach_columns:
kwargs[key] = bleach.clean(kwargs[key], tags=[], strip=True)
super(Example, self).__init__(**kwargs)
这在使用Example(field1='foo', field2='bar')
创建对象时有效。但是,我不确定如何处理各个字段的分配。我正在考虑这些问题,但我不确定标记为ASSIGN的部分:
def __setattr__(self, attr, obj):
if(attr in Example._bleach_columns):
ASSIGN(..... , bleach.clean(obj, tags=[], strip=True))
else:
ASSIGN(..... , obj)
更一般地说,我的印象是这不是处理标签过滤的最佳方式。因此,我非常感谢有关如何最好地实现此行为的任何提示,最好是使用新列类型的装饰器。
看起来这可以通过在Qazxswpoi中应用漂白剂的TypeDecorator(link)来完成。但是,我无法弄清楚如何将此装饰器应用于上面db.Model派生类中基于flask_sqlalchemy的列定义。
我终于设法解决了这个问题......一旦人们理解了它的全部内容,这很容易。
首先要明白process_bind_param
与SQLAlchemy的db.Column
相同。因此我可以使用相同的语法。为了实现变长字符串,我使用类工厂来返回装饰器。如果有另一个解决方案来实现这个长度,我很想知道它。无论如何,这是代码:
column
以上是关于SQLAlchemy模型中的进程字段(使用flask_sqlalchemy)的主要内容,如果未能解决你的问题,请参考以下文章
ModuleNotFoundError:没有名为“flask_sqlalchemy”的模块