Grając z https://github.com/salimane/bottle-mvc przykład. Próbuję wyodrębnić trasy tylko do pliku i defs podobnych do folderu kontrolerów. Co próbuję symulować, jest rubin na trasach szynowych / zachowaniu kontrolera.

Aby to osiągnąć, najpierw to zrobiłem

Aplikacja / sterowniki / drukowanie.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='')

Zrobiłem "coś = ''" Cuz Python daje mi błędy na prowadzeniu serwera. powiedzenie

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

Po tym małej sztuczki biegnie serwer i wszystko działa dobrze.

Potem zrobiłem to samo z / trasą drukowania:

Aplikacja / sterowniki / drukowanie.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)

Z tym błędem Pythona:

SyntaxError: invalid syntax

Wskazać na ostatnią linię (EOF). Przetestowałem różne kombinacje, ale utknąłem.

OS X 10.9, butelka 0.11.6, Python 2.7


EDYTOWAĆ:

Myślę, że się nie wyjaśniłem.

Chcę, jest coś takiego:

Aplikacja / konfiguracja / trasy.py

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

Aplikacja / sterowniki / drukowanie.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='')

Parametr "coś" był obejściem, aby działał, bo Python dał mi błędy.

Nie mogę oddzielić tras z Defs ... to główny problem.

0
vladimir prieto 6 grudzień 2013, 01:21

2 odpowiedzi

Najlepsza odpowiedź

Jesteś blisko. Zasadniczo wystarczy zadzwonić route jako funkcję, a nie dekorator. (Usunąć "@")

Więc jeśli zdefiniujesz logikę w 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='')

W ten sposób twój główny program dołączyłby wywołania zwrotne:

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)

Kiedy biegam python routes.py, działa zgodnie z oczekiwaniami:

% 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, ponieważ nie znaleziono szablonu, ale punkt jest taki, że pobiegł funcs.printer().)

1
ron rothman 6 grudzień 2013, 17:46

@ app.route to dekorator funkcji, więc należy go użyć w ten sposób:

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

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

Sprawdź tutaj: http://www.python.org/dev/peps/pep-0318 /.

1
PasteBT 5 grudzień 2013, 21:33