【问题标题】:AttributeError: 'tuple' object has no attribute 'strip' : Flask Markdown?AttributeError:'tuple' 对象没有属性'strip':Flask Markdown?
【发布时间】:2015-07-30 02:42:59
【问题描述】:

我一直在关注 Miguel Grinberg 的 Flask Web Development。在构建博客时,我无法理解错误(我得到的)是什么以及是由于我的代码还是由于我正在使用的扩展。

   File "/home/abhinav/projects/sample/app/blog/views.py", line 51, in edit
    blog.body=form.body.data,
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 224, in __set__
    instance_dict(instance), value, None)
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 696, in set
    value, old, initiator)
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 705, in fire_replace_event
    self._init_append_or_replace_token())
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/sqlalchemy/orm/events.py", line 1534, in wrap
    fn(target, value, *arg)
  File "/home/abhinav/projects/sample/app/models.py", line 368, in on_changed_body
    markdown(value, output_format='html'),
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/markdown/__init__.py", line 494, in markdown
    return md.convert(text)
  File "/home/abhinav/projects/avenues-flask/venv/lib/python2.7/site-packages/markdown/__init__.py", line 355, in convert
    if not source.strip():
AttributeError: 'tuple' object has no attribute 'strip'

为了插入图片和其他内容以发布为 HTML,我在我的 models.py 文件中使用了以下 sn-p: 我从here 获得了部分 sn-p。

class Blog(db.Model):
    __tablename__ = 'blogs'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64), unique=True, index=True)
    body = db.Column(db.Text)
    summary = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    body_html = db.Column(db.Text)
    summary_html = db.Column(db.Text)

    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code',
                        'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul',
                        'h2', 'h3', 'p', 'img', 'video', 'div', 'iframe', 'p', 'br', 'span', 'hr', 'src', 'class']
        allowed_attrs = {'*': ['class'],
                         'a': ['href', 'rel'],
                         'img': ['src', 'alt']}
        target.body_html = bleach.linkify(bleach.clean(
            markdown(value, output_format='html'),
            tags=allowed_tags, strip=False, attributes=allowed_attrs))


    @staticmethod
    def on_changed_summary(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'code', 'em', 'i',
                    'strong']
        target.summary_html = bleach.linkify(bleach.clean(
            markdown(value, output_format='html'),
            tags=allowed_tags, strip=True))

db.event.listen(Blog.body, 'set', Blog.on_changed_body)
db.event.listen(Blog.summary, 'set', Blog.on_changed_summary)

我还在我拥有的字段中看到了一些不需要的字符。这些字符可以在标题字段以及博客条目内容部分中看到。这也注意到here

编辑

我正在添加我的功能

def edit(id):
    blog = Blog.query.get_or_404(id)
    if current_user != blog.author and \
            not current_user.can(Permission.WRITE_BLOG_ARTICLES):
        abort(403)
    form = BlogForm()
    if form.validate_on_submit():
        blog.title=form.title.data,
        blog.body=form.body.data,
        blog.summary=form.summary.data
        db.session.add(blog)
        flash('The blog has been updated.')
        return redirect(url_for('.entry', id=blog.id))
    form.title.data = blog.title,
    form.body.data = blog.body,
    form.summary.data = blog.summary
    return render_template('blog/edit_blog_post.html', form=form)

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    你在烧瓶中使用interactive debugger 吗?它允许您检查每个级别的回溯并查看变量是什么。

    如果使用调试器触发错误,则展开这行回溯:

      File "/home/abhinav/projects/sample/app/models.py", line 368, in on_changed_body
        markdown(value, output_format='html'),
    

    然后检查value 的内容,我猜它会是一个元组而不是一个字符串。

    您还可以在此行之前使用print 语句来检查内容:

        ...original code...
        print value
        target.summary_html = bleach.linkify(bleach.clean(
            markdown(value, output_format='html'),
            tags=allowed_tags, strip=True))
        ...
    

    (但我真的推荐调试器而不是print 调试!它更好)

    如果value 确实是一个字符串,那么您可以在回溯的周围级别重复相同的过程。这将告诉您它是否被转换为 markdown 包中的元组,这可能是库本身的错误,或者您的代码中是否存在其他问题。这种调试方法可以让您找出问题所在。

    至于您对“不良字符”的注释,您是指这个吗?

    (u'Block quote should finally work.. Well',)
    

    如果您在最终输出中看到这一点,则意味着您以某种方式传递了一个元组而不是字符串。

    >>> title = (u'Block quote should finally work.. Well',)
    >>> type(title)
    <type 'tuple'>
    >>> title.strip()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'tuple' object has no attribute 'strip'
    
    #vs..
    
    >>> title = u'Block quote should finally work.. Well'
    >>> type(title)
    <type 'unicode'>
    >>> title.strip()
    u'Block quote should finally work.. Well'
    

    针对您发布的新代码,请查看以下几行:

    form.title.data = blog.title,
    form.body.data = blog.body,
    

    尾随逗号创建一个元素的元组:

    >>> 'a',
    ('a',)
    >>> x = 'a',
    >>> type(x)
    <type 'tuple'>
    

    删除杂散的逗号,这应该至少可以解决您的一个问题。

    【讨论】:

    • 感谢您提供如此好的答案。我尝试了您所写的内容,但仍然无法解决我的问题。 blog.bodyform.body.data 都变成了 unicode 类型。我已将我的功能添加到问题中。可以给点建议吗?
    • 好的。我得到了它。 blog.title 作为元组传递。但我还是不知道为什么。
    • 是的!尝试在调试器中查看value 的内容而不是blog.bodyform.body.data,它应该是一个元组。我只是在我的答案中添加了更多信息。如果这对您有所帮助,请不要忘记标记accepted answer!快乐的黑客:)
    猜你喜欢
    • 2022-11-17
    • 2017-05-03
    • 2020-03-25
    • 2016-08-11
    • 2021-03-18
    • 1970-01-01
    • 2023-01-26
    • 2013-07-19
    • 2013-07-18
    相关资源
    最近更新 更多