Python 属性错误:';元组';对象没有属性';条带';:烧瓶降价?

Python 属性错误:';元组';对象没有属性';条带';:烧瓶降价?,python,flask,flask-sqlalchemy,flask-wtforms,Python,Flask,Flask Sqlalchemy,Flask Wtforms,我一直遵循Miguel Grinberg的Flask Web开发路线。在创建博客时,我无法理解(我得到的)错误是什么,以及是由于我的代码还是由于我使用的扩展 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/s

我一直遵循Miguel Grinberg的Flask Web开发路线。在创建博客时,我无法理解(我得到的)错误是什么,以及是由于我的代码还是由于我使用的扩展

   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文件中使用了以下代码段: 我从中得到了部分片段

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

编辑

我正在添加我的函数

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)
你用烧瓶里的水吗?它允许您检查回溯的每个级别,并查看变量是什么

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

  File "/home/abhinav/projects/sample/app/models.py", line 368, in on_changed_body
    markdown(value, output_format='html'),
检查
value
的内容,我猜它将是一个元组而不是一个字符串

>>> 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'
您还可以在此行之前使用
print
语句检查内容:

    ...original code...
    print value
    target.summary_html = bleach.linkify(bleach.clean(
        markdown(value, output_format='html'),
        tags=allowed_tags, strip=True))
    ...
(但我真的建议使用调试器而不是
print
debuging!它好多了)

如果
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'
尾随逗号创建一个元素的元组:

>>> 'a',
('a',)
>>> x = 'a',
>>> type(x)
<type 'tuple'>
>“a”,
(‘a’,)
>>>x='a',
>>>类型(x)

删除多余的逗号,这至少可以解决您的一个问题。

谢谢您的回答。我尝试了你写的东西,但仍然无法解决我的问题。
blog.body
form.body.data
都是unicode类型。我已将我的功能添加到问题中。你能给点建议吗?好的。我得到了它。blog.title正在作为元组传递。但我仍然不知道为什么。是的!尝试在调试器中查看
value
的内容,而不是
blog.body
form.body.data
,它应该是一个元组。我只是在回答中添加了更多信息。如果这对你有帮助,别忘了标记一个!快乐黑客:)
>>> 'a',
('a',)
>>> x = 'a',
>>> type(x)
<type 'tuple'>