Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Bottle 404 not found

+2 votes

Je n'arrive pas à faire un routing correct avec Bottle.

J' étais sous Flask et ça marchait bien, mais voulant utiliser un raspberry pour faire un petit serveur et ayant rencontré un pb de versioning j'ai migré sur Bottle.

Sur Bottle, le routing semble plus capricieux que sur Flask. J' ai lu le tuto mais dès que je sort de la page d' accueil via un get, un post , ou même directement dans la barre d' adresse, je tombe sur un 404.

Je mets des templates avec extension tpl dans un sous repertoire views, je fais du copié coller de code mais ça marche pas.

Ma dernière tentative :

from bottle import Bottle, run, route, debug, template, get, post, request , view
import requests
from datetime import date, time, datetime,timedelta
import datetime 
import os, os.path
import sqlite3

app = Bottle()


@app.route('/',methods=['GET'])
@get('/login') # or @route('/login')
def login():
    return '''
    <form action="/login" method="post">
        Username: <input name="username" type="text" />
        Password: <input name="password" type="password" />
    <input value="Login" type="submit" />
</form>
'''

 #@post('/login') # or @route('/login', method='POST')
 @app.route('/', method='POST')
 @get('/exped')
 def exped():
    username = request.forms.get('username')
    password = request.forms.get('password')
    if check_login(username, password):
        return "<p>Your login information was correct.</p>"
    else:
        return "<p>Login failed.</p>"

 @route('/hello')
 @view('hello')
 @route('/hello/<name>')
 def hello(name='World'):
     return template(hello, name=name)


debug(True)
run(app, host='0.0.0.0', port=8080, reloader=True)
demandé 18-Fev-2015 par buffalo974 (2,690 points)
edité 18-Fev-2015 par foxmask

1 Réponse

+3 votes
 
Meilleure réponse

dans la 1° fonction, le form envoi via post sur l'url /login mais avec la method post

donc

from bottle import Bottle, run, route, debug, template, get, post, request , view

@app.route('/', methods=['GET'])
@get('/login')
def login():
    return '''
    <form action="/login" method="post">
        Username: <input name="username" type="text" />
        Password: <input name="password" type="password" />
        <input value="Login" type="submit" />
    </form>
    '''

@app.route('/login', method='POST')
@get('/exped')
def exped():
    username = request.forms.get('username')
    password = request.forms.get('password')
    if check_login(username, password):
        return "<p>Your login information was correct.</p>"
    else:
        return "<p>Login failed.</p>"

Par contre cca va peter une erreur de check_login() non définie... puisque c'est pour l'exemple (dans le tuto)

répondu 18-Fev-2015 par foxmask (2,874 points)
sélectionné 18-Fev-2015 par buffalo974
...