Python 在瓶子上定义一个路由配置文件

Python 在瓶子上定义一个路由配置文件,python,model-view-controller,bottle,Python,Model View Controller,Bottle,我一直在以身作则。我试图将路由提取到一个文件和def,类似于controllers文件夹。我试图模拟的是RubyonRails路由/控制器行为 为了达到这个目的,我首先做了这件事 app/controllers/print.py def index(something=''): return template('printer/index', message='') @app.route('/', method='GET',callback=index) @app.route('/p

我一直在以身作则。我试图将路由提取到一个文件和def,类似于controllers文件夹。我试图模拟的是RubyonRails路由/控制器行为

为了达到这个目的,我首先做了这件事

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='')
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)
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在运行服务器时给了我错误。说

TypeError: index() takes no arguments (1 given)
在那个小把戏之后,服务器运行,一切正常

然后我对/print route执行了相同的操作:

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='')
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)
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='')
对于此python错误:

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

OSX10.9,瓶子0.11.6,python 2.7


编辑:

我想我没有解释我自己

我想要的是这样的:

@app.route('/', method='GET')
def index(something=''):
    ...

@app.route('/print', method=['GET', 'POST'])
def printer(something=''):
    ...
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='')
@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='')
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)
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给了我错误


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

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

@app.route('/', method='GET')
def index(something=''):
    ...

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

检查这里:

你很接近了。基本上,您只需要将
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>
%12:44:32~/>http://127.0.0.1:8080/print
错误:500内部服务器错误
...
错误:500内部服务器错误
抱歉,请求的URL';http://127.0.0.1:8080/print'
导致错误的原因:

模板';打印机/打印和#039;没有找到。

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

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

”,但它也不起作用。我也像‘python runserver.py’一样运行(我像链接上说的那样使用)。。。我实际上只是复制了我的两个代码块,运行了它们,它按预期工作(HTTP 500)。和你一样,我也使用OSX 10.9、瓶子0.11.6和Python 2.7。你确定你准确地复制了我的代码,没有修改它,并将其与我的
curl
示例调用相同吗?