2015-07-30 4 views
1

Я слежу за линиями разработки флагов Мигеля Гринберга. При создании блога я не могу понять, что такое ошибка (которую я получаю), и является ли это результатом моего кода или из-за расширений, которые я использую.AttributeError: объект 'tuple' не имеет атрибута 'strip': Flask Markdown?

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 файле: я получил часть фрагмента из here.

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.

The undesired characters can be seen in the title field as well as the Blog Entry Content section.

EDIT

Я добавляю моя функция

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) 

ответ

3

Используете ли вы interactive debugger в колбе? Это позволяет вам изучить каждый уровень трассировки и посмотреть, что представляют собой переменные.

Если вызвать ошибку с отладчиком, а затем расширить эту линию TRACEBACK:

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 действительно строка там, то вы можете повторить тот же процесс в окружающих уровнях трассировки. Это скажет вам, превращается ли он в кортеж внутри пакета уценки, что может быть ошибкой в ​​самой библиотеке или если в коде есть какая-то другая проблема. Этот метод отладки позволит вам установить нуль, где проблема.

Что касается вашей заметки о «нежелательных персонажах», вы имеете в виду это?

(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'> 

Удалите запятые запятые, и это должно решить хотя бы одну из ваших проблем.

+0

Благодарим вас за такой отличный ответ. Я пробовал то, что вы написали, и я все еще не мог решить свою проблему. Оба типа 'blog.body' и' form.body.data' выходят за тип unicode. Я добавил свою функцию к вопросу. Можете ли вы дать какие-либо предложения? – spunkpike

+0

Хорошо. Я понял. blog.title передается как кортеж. Но я все еще не знаю, почему. – spunkpike

+2

Да! Попробуйте посмотреть содержимое 'value' в отладчике вместо' blog.body' и 'form.body.data', это должен быть кортеж. Я просто добавил больше информации к моему ответу. Если это помогло вам не забыть отметить [принятый ответ] (https://stackoverflow.com/help/accepted-answer)! Happy hacking :) –

Смежные вопросы