一直在玩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分开......这是主要问题。
答案 0 :(得分:1)
@ app.route是一个函数装饰器,因此它应该像这样使用:
@app.route('/', method='GET')
def index(something=''):
...
@app.route('/print', method=['GET', 'POST'])
def printer(something=''):
...
答案 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>'http://127.0.0.1:8080/print'</tt>
caused an error:</p>
<pre>Template 'printer/print' not found.</pre>
</body>
</html>
(HTTP 500,因为找不到模板,但重点是它运行funcs.printer()
。)