2016-11-27 1 views
0

Ich versuche, ein einfaches Blog auf Web.py läuft, startet es gut (Python bin/blog.py), aber wenn ich die Website eingeben, heißt es, dass es keine Vorlage finden kann. Ich bin ziemlich sicher, dass der Weg richtig ist, ich habe vorher eine einfache Todo-Liste gemacht und es funktioniert gut. Was ist los mit dir?Keine Vorlage mit dem Namen index

hier ist mein Projektordner aussehen:

-blogpy/ 
    -bin/ 
    -blogwebpy/ 
    -docs/ 
    -templates/ 
    -tests/ 

Hier ist der Code für blog.py, die in Bin befindet (Vorlagen in Vorlagen gespeichert sind):

import web 
import model 

### Url mappings 

urls = (
    '/', 'Index', 
    '/view/(\d+)', 'View', 
    '/new', 'New', 
    '/delete/(\d+)', 'Delete', 
    '/edit/(\d+)', 'Edit', 
) 


### Templates 
t_globals = { 
    'datestr': web.datestr 
} 
render = web.template.render('templates/', base='base', globals=t_globals) 


class Index: 

    def GET(self): 
     """ Show page """ 
     posts = model.get_posts() 
     return render.index(posts) 


class View: 

    def GET(self, id): 
     """ View single post """ 
     post = model.get_post(int(id)) 
     return render.view(post) 


class New: 

    form = web.form.Form(
     web.form.Textbox('title', web.form.notnull, 
      size=30, 
      description="Post title:"), 
     web.form.Textarea('content', web.form.notnull, 
      rows=30, cols=80, 
      description="Post content:"), 
     web.form.Button('Post entry'), 
    ) 

    def GET(self): 
     form = self.form() 
     return render.new(form) 

    def POST(self): 
     form = self.form() 
     if not form.validates(): 
      return render.new(form) 
     model.new_post(form.d.title, form.d.content) 
     raise web.seeother('/') 


class Delete: 

    def POST(self, id): 
     model.del_post(int(id)) 
     raise web.seeother('/') 


class Edit: 

    def GET(self, id): 
     post = model.get_post(int(id)) 
     form = New.form() 
     form.fill(post) 
     return render.edit(post, form) 


    def POST(self, id): 
     form = New.form() 
     post = model.get_post(int(id)) 
     if not form.validates(): 
      return render.edit(post, form) 
     model.update_post(int(id), form.d.title, form.d.content) 
     raise web.seeother('/') 


app = web.application(urls, globals()) 

if __name__ == '__main__': 
    app.run() 

Antwort

1

Wie angegeben, render sucht für templates Verzeichnis relativ zum aktuellen Arbeitsverzeichnis, dh von wo Sie versuchen, das Programm auszuführen.

ein paar verschiedene Möglichkeiten, es zu beheben:

  1. Abarbeiten von blogpy Verzeichnis:

    python bin/blog.py 
    

    Das wird richtig templates in blogpy/templates finden.

  2. Führen Sie von bin Verzeichnis, aber render Blick in ../templates. Dies würde eine kleine Änderung an Ihrem Code erfordern, wo Sie den Speicherort des Templates-Unterverzeichnisses angeben. (Dies ist, was ich für Ihr Beispiel vorschlage).

  3. aus bin Verzeichnis ausführen, aber das templates Verzeichnis verschieben unter dem bin-Verzeichnis sein. Das mag seltsam aussehen, aber wenn Sie nach einer einfachen Lösung suchen, ist nichts falsch daran.

  4. Verwenden Sie vollständig angegebene Pfadnamen. Letztendlich solltest du das tun, obwohl es für dein Beispiel zu viel ist. Sie werden in der Zukunft mit einem Block wie speichern:

    === repositories.py === 
    import os 
    _dir_name = os.path.dirname(__file__) or os.getcwd() 
    templates = os.path.normpath(os.path.join(_dir_name, "../templates")) 
    

    Sie werden in der Lage sein, alle Ihre Unterverzeichnisse zu finden (für statische Inhalte, vielleicht Verschlüsselungsschlüssel, etc.) zuverlässig, unabhängig, wie der Code aufgerufen wird.

Verwandte Themen