users = "|".join(user.get_all_users()) # Hae käyttäjälista tietokannasta @route('/<name:re:(' + users + ')>') def user_path(name): return name @route('/user/create', method='POST') def user_create(): global users # Lisää käyttäjä users = "|".join(user.get_all_users()) print users
Ongelmana on, että kun muuttujaa users muutetaan, tuo @route pitää saman users-listan kuin mitä se oli kun käynnistin python-tiedoston. Eli jos uusi käyttäjä rekisteröityy, @route:n regex-filter ei lataa muuttunutta users-muuttujaa, eli käyttäjä ei voi mennä omalle sivulleen, vaan tulee 404. Kun painan Ctrl+C ja suoritan python-tiedoston uudelleen, vasta silloin regex-filter lataa muuttuneen users-muuttujan.
Routet ovat merkkijonoja. Ymmärrät kai tästä välittömästi sen, ettei route päivity, jos muutat sellaisen muuttujan arvoa, jota on käytetty kyseisen merkkijonon luomiseen.
foo = 'foo' string = 'testi' + foo foo = 'bar' print(string)
Älä ylläty...
-----
Todellinen ongelma on se, että suoraan sanoen raiskaat routeja käyttäessäsi niitä noin täydellisen väärin. Route saa täsmätä oikeastaan ihan mihin tahansa merkkijonoon käyttäjänimen osalta. Tarkistat vain funktion sisällä, että löytyykö nimellä käyttäjää vai pitääkö näyttää virhesivu.
Jos oikeasti haluat käyttää käyttäjän profiiliin ohjaavana urlina juuritasoa ('/my_username'), niin laita kyseinen route viimeiseksi, jolloin se olettaakseni suoritetaan vain silloin, kun aiemmat routet eivät täsmää.
Suosittelisin kyllä käyttämään vähemmän monitulkintaisia polkuja, esimerkiksi tällaista: '/profile/my_username'.
Ymmärrän kyllä merkkijonot. Olen kai niin tyhmä, että en tullut ajatelleeksi sitä tehdessäni tätä. Kiitos selvennyksestä. Kai voisin tehdä routet tyyliin '/profile/username', mutta mieluummin haluan ne suoraan '/username' tyyliin. Pitääpä laittaa tuo virhesivu-ohjaus toimimaan.
EDIT: Nyt toimii tosi hyvin, users routen ei tarvi etes olla viimeisenä. Kiitos paljon
Aihe on jo aika vanha, joten et voi enää vastata siihen.