在瓶子上定义路径配置文件

时间:2013-12-05 21:21:58

标签: python model-view-controller bottle

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

为了实现我第一次做到这一点

应用程序/控制器/ 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 =''”cuz python给我运行服务器时出错。说

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

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

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

应用程序/控制器/ 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


编辑:

我想我没有解释自己。

我想要的是这样的:

应用程序/配置/ routes.py

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

应用程序/控制器/ 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”参数是一种解决方法,使其工作,cuz python给了我错误。

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

2 个答案:

答案 0 :(得分:1)

@ 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/

答案 1 :(得分: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()。)