0

我正在尝试使用bottle和sqlalchemy在heroku上设置一个简单的服务器,但我不断收到错误消息,因为“db”关键字没有被注入,所以我没有给我的方法提供足够的参数。这是我尝试过的:

import os
from bottle import *
import bottle
from bottle.ext import sqlalchemy
from sqlalchemy import create_engine, Column, Integer, Sequence, String
from sqlalchemy.ext.declarative import declarative_base
import json

app = bottle.Bottle()
database_url = os.environ["DATABASE_URL"]

Base = declarative_base()
engine = create_engine(database_url, echo=True)

plugin = sqlalchemy.Plugin(
        engine,
        Base.metadata,
        keyword='db',
        create=True,
        commit=True,
        use_kwargs=False
)

app.install(plugin)

class Path(Base):
    __tablename__ = "path"
    id = Column(Integer, Sequence("id_seq"), primary_key=True)
    start_node = Column(String)
    end_node = Column(String)
    path = Column(String)

    def __init__(self, start_node, end_node, path):
        self.start_node = start_node
        self.end_node = end_node
        self.path = path

    def __repr__(self):
        return "<Path(id: '%d', start_node: '%s', end_node: '%s', path: '%s')>" & (self.id, self.start_node, self.end_node, self.path)

@app.get("/get", db)
def node_value(db):
    node = "face"
    start_path = db.query(Path).filter_by(start_node=node)
    end_path = db.query(Path).filter_by(end_node=node)
    if start_path and end_path:
        data = start_node
        data.append(end_path)
    if start_path:
        return start_node
    if end_path:
        return end_path
    else:
        return "ERROR"


@route("/")
def hello_world():
    return "Hello, World!"

run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000)))

感谢你的帮助!

4

1 回答 1

0

我运行了你的代码,它对我有用。我唯一改变的东西似乎与你描述的你的经历不一致,但也许它们会有所帮助:

  1. 从你的装饰中删除了db参数。app.get
  2. 您需要调用应用程序的运行方法,而不是瓶子的。IE,

所以这两行从:

@app.get("/get", db)
...
run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000)))

@app.get("/get")
...
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 3000)))

然后它按预期工作。如果这些更改不能解决您的问题,请准确发布您正在做什么以生成错误消息以及消息是什么,我会看看我是否可以重现它。

PS,当我说它“对我有用”时,我的意思是node_value根据原始 Q 调用该方法。我并不是说它实际上任何作用。:) 哦,仅供参考,我还将 DATABASE_URL 设置为“sqlite:///:memory:”

于 2013-04-15T00:49:26.460 回答