【问题标题】:define a route config file on bottle在瓶子上定义一个路由配置文件
【发布时间】:2013-12-07 03:32:29
【问题描述】:

一直在玩https://github.com/salimane/bottle-mvc 示例。我正在尝试将路由提取到一个文件和类似于控制器文件夹的定义。我试图模拟的是 Ruby on Rails 路由/控制器行为。

为了实现这一点,我首先这样做了

app/controllers/print.py

def index(something=''):
    return template('printer/index', message='')
@app.route('/', method='GET',callback=index)


@app.route('/print', method=['GET', 'POST'])
def printer():
    if request.method == 'POST':
        from project.models.Printer import Printer
        printer = Printer()
        message = printer.show_string(request.forms.get('text'))
        return template('printer/index', message=message)
    return template('printer/print', message='')

我做了“something=''”因为 python 在运行服务器时给了我错误。说

TypeError: index() takes no arguments (1 given)

在这个小技巧之后,服务器运行并且一切正常。

然后我对 /print 路线做了同样的事情:

app/controllers/print.py

def index(something=''):
    return template('printer/index', message='')
@app.route('/', method='GET',callback=index)


def printer(something=''):
    if request.method == 'POST':
        from project.models.Printer import Printer
        printer = Printer()
        message = printer.show_string(request.forms.get('text'))
        return template('printer/index', message=message)
    return template('printer/print', message='')

@app.route('/print', method=['GET', 'POST'], callback=printer)

出现这个 python 错误:

SyntaxError: invalid syntax

指向最后一行 (EOF)。测试了各种组合,但我被卡住了。

OS X 10.9、Bottle 0.11.6、python 2.7


编辑:

我想我没有解释自己。

我想要的是这样的:

app/config/routes.py

@app.route('/', method='GET', callback=index)
@app.route('/print', method=['GET', 'POST'], callback=printer)

app/controllers/print.py

def index(something=''):
    return template('printer/index', message='')

def printer(something=''):
    if request.method == 'POST':
        from project.models.Printer import Printer
        printer = Printer()
        message = printer.show_string(request.forms.get('text'))
        return template('printer/index', message=message)
    return template('printer/print', message='')

“something”参数是使其工作的解决方法,因为 python 给了我错误。

我无法将路由与 defs 分开...这是主要问题。

【问题讨论】:

    标签: python model-view-controller bottle


    【解决方案1】:

    你已经接近了。基本上,您只需要将route 作为函数调用,而不是装饰器。 (去掉“@”)

    所以,如果你在 funcs.py 中定义你的逻辑:

    from bottle import template, request, Bottle
    
    def index(something=''):
        return template('printer/index', message='')
    
    def printer(something=''):
        if request.method == 'POST':
            from project.models.Printer import Printer
            printer = Printer()
            message = printer.show_string(request.forms.get('text'))
            return template('printer/index', message=message)
        return template('printer/print', message='')
    

    那么这就是你的主程序附加回调的方式:

    import bottle
    import funcs
    
    app = bottle.Bottle()
    
    app.route('/', method='GET', callback=funcs.index)
    app.route('/print', method=['GET', 'POST'], callback=funcs.printer)
    
    app.run(host='127.0.0.1', port=8080)
    

    当我运行python routes.py 时,它按预期工作:

    % 12:44:32 ~/>curl http://127.0.0.1:8080/print
        <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
        <html>
            <head>
                <title>Error: 500 Internal Server Error</title>
                ...
            </head>
            <body>
                <h1>Error: 500 Internal Server Error</h1>
                <p>Sorry, the requested URL <tt>&#039;http://127.0.0.1:8080/print&#039;</tt>
                   caused an error:</p>
                <pre>Template &#039;printer/print&#039; not found.</pre>
            </body>
        </html>
    

    (HTTP 500 因为找不到模板,但关键是它运行了funcs.printer()。)

    【讨论】:

    • 它对我不起作用。给了我404错误。即使我没有使用模板,我也使用了“

      hello

      ”,但它也不起作用。我也像'python runserver.py'一样运行(我像链接所说的那样使用)。
    • 好的...我实际上只是复制了我的两个代码块,运行它们,它按预期工作(HTTP 500)。和你一样,我在 OSX 10.9,瓶子 0.11.6,Python 2.7 上。你确定你完全复制了我的代码,没有修改它,并且和我的curl例子一样称呼它吗?
    【解决方案2】:

    @app.route 是一个函数装饰器,所以应该这样使用:

    @app.route('/', method='GET')
    def index(something=''):
        ...
    
    @app.route('/print', method=['GET', 'POST'])
    def printer(something=''):
        ...
    

    在这里查看:http://www.python.org/dev/peps/pep-0318/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多