gpt4 book ai didi

python - SQLAlchemy 模型中的流程字段(使用 flask_sqlalchemy)

转载 作者:搜寻专家 更新时间:2023-10-30 23:31:06 39 4
gpt4 key购买 nike

我正在通过 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)

更一般地说,我的印象是这不是处理标签过滤的最佳方式。因此,对于如何最好地实现此行为的任何提示,最好使用新列类型的装饰器,我将不胜感激。

看起来这可以通过在 process_bind_param 中应用漂白剂的 TypeDecorator ( link ) 来完成。但是,我不知道如何将此装饰器应用于上面 db.Model 派生类中基于 flask_sqlalchemy 的列定义。

最佳答案

我终于设法解决了这个问题...像往常一样,一旦理解了它的全部内容,这就很容易了。

首先要了解 db.Column 与 SQLAlchemy 的 column 相同。因此我可以使用相同的语法。为了实现可变长度字符串,我使用类工厂来返回装饰器。如果有另一种解决方案来实现长度,我很想听听。无论如何,这是代码:

def bleachedStringFactory(len):

class customBleachedString(types.TypeDecorator):

impl = types.String(len)

def process_bind_param(self, value, dialect):
return bleach.clean(value, tags=[], strip=True)

def process_result_value(self, value, dialect):
return value

return customBleachedString


class Example(db.Model):
__tablename__ = 'examples'
id = db.Column(db.Integer, primary_key=True)
field1 = db.Column(bleachedStringFactory(64), unique=True)
field2 = db.Column(bleachedStringFactory(128))

关于python - SQLAlchemy 模型中的流程字段(使用 flask_sqlalchemy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003698/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com