2 Stimmen

Pylons 1.0 AttributeError: Objekt 'module' hat kein Attribut 'metadata'

Python Noob versucht, Pylons zu lernen. Ich verwende das QuickWiki-Tutorial ( http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/ ) aus der 1.0-Dokumentation, aber dieses angebliche "1.0"-Dokument scheint nur "0.9.7" zu sein; ich vermute, dass dies etwas mit dem Fehler zu tun hat, den ich bekomme.

Wenn ich "paster setup-app development.ini" ausführe, erhalte ich Folgendes:

(mydevenv)lucid@lucid-laptop:~/QuickWiki$ paster setup-app development.ini
Traceback (most recent call last):
... edited for brevity...
File "/home/lucid/mydevenv/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 1954, in load
File "/home/lucid/QuickWiki/quickwiki/config/middleware.py", line 11, in <module>
from quickwiki.config.environment import load_environment
File "/home/lucid/QuickWiki/quickwiki/config/environment.py", line 12, in <module>
from quickwiki.model import init_model
File "/home/lucid/QuickWiki/quickwiki/model/__init__.py", line 27, in <module>
pages_table = sa.Table('pages', meta.metadata,
AttributeError: 'module' object has no attribute 'metadata'
(mydevenv)lucid@lucid-laptop:~/QuickWiki$

4voto

estin Punkte 2851

Dies ist ein Fehler in der Dokumentation http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/

Deklarieren Sie pages_table wie folgt

from quickwiki.model.meta import Base
pages_table = sa.Table('pages', Base.metadata,
                sa.Column('title', sa.types.Unicode(40), primary_key=True),
                sa.Column('content', sa.types.UnicodeText(), default='')
                )

Kein Loger meta.metadata, verwenden Sie meta.Base.metadata und definieren Sie Ihre Modelle mit der deklarativen Basiserweiterung von SqlAlchemy http://www.sqlalchemy.org/docs/05/ormtutorial.html#creating-table-class-and-mapper-all-at-once-declaratively

2voto

driax Punkte 2378

Ihr Kommentar zu Estins Antwort fragt, ob sich dies zwischen SqlAlchemy 0.5 und 0.6 ändert.

Das ist nicht der Fall. Es ist das Gleiche. Es ist Pylons, die jetzt andere Standardeinstellungen haben. Wie Estin sagt, erstellt Pylons standardmäßig eine declarative_base(), so dass Sie SqlAlchemy deklarativ verwenden können.

class MyRecord(Base):
     __tablename__ = "myrecord"

     id = Column(Integer, primary_key=True)
     data = Column(Unicode, nullable=False)

Anstatt zuerst die Tabellen mit Hilfe von Table()-Konstrukten zu spezifizieren, dann Ihre Klassen zu erstellen und sie dann mit mapper() zusammenzuführen.

SqlAlchemy Declarative tut dies automatisch. Quickwiki rät Ihnen, die explizite, nicht deklarative Version von SqlAlchemy zu verwenden, für die es keinen Grund gibt (deklarativ ist prägnanter). Pylons verwendet, um die Standard-Metadaten als model.meta.metadata freizulegen, aber jetzt ist es von declarative_base() erstellt und in model.meta.Base.metadata ausgesetzt.

2voto

shiki Punkte 43

Nur für den Fall, dass jemand auf das gleiche Problem stößt, füge ich mein Modell bei. init und Websetup:

"""=========================__init__.py========================="""
    """The application's model objects"""
from quickwiki.model.meta import Session, Base

def init_model(engine):
    """Call me before using any of the tables or classes in the model"""
    Session.configure(bind=engine)

import logging
import re
import sets
from docutils.core import publish_parts

from pylons import url
from quickwiki.lib.helpers import link_to

log = logging.getLogger(__name__)

# disable docutils security hazards:
# http://docutils.sourceforge.net/docs/howto/security.html
SAFE_DOCUTILS = dict(file_insertion_enabled=False, raw_enabled=False)
wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)", re.UNICODE)

from sqlalchemy import orm
import sqlalchemy as sa

pages_table = sa.Table('pages', Base.metadata,
                sa.Column('title', sa.types.Unicode(40), primary_key=True),
                sa.Column('content', sa.types.UnicodeText(), default='')
                )

class Page(object):

    def __init__(self, title, content=None):
        self.title = title
        self.content = content

    def get_wiki_content(self):
        """Convert reStructuredText content to HTML for display, and
        create links for WikiWords
        """
        content = publish_parts(self.content, writer_name='html',
                                settings_overrides=SAFE_DOCUTILS)['html_body']
        titles = sets.Set(wikiwords.findall(content))
        for title in titles:
            title_url = url(controller='pages', action='show', title=title)
            content = content.replace(title, link_to(title, title_url))
        return content

    def __unicode__(self):
        return self.title

    __str__ = __unicode__

orm.mapper(Page, pages_table)

"""=========================websetup.py========================="""

"""Setup the QuickWiki application"""
import logging

import pylons.test

from quickwiki.config.environment import load_environment
from quickwiki.model.meta import Session, Base
from quickwiki import model

log = logging.getLogger(__name__)

def setup_app(command, conf, vars):
    """Place any commands to setup quickwiki here"""
    load_environment(conf.global_conf, conf.local_conf)

    # Create the tables if they don't already exist
    log.info("Creating tables...")
    Base.metadata.create_all(bind=Session.bind)
    log.info("Successfully set up.")

    log.info("Adding front page data...")
    page = model.Page(title=u'FrontPage',
                      content=u'**Welcome** to the QuickWiki front page!')

    Session.add(page)
    Session.commit()
    log.info("Successfully set up.")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X