2017-06-19 3 views
2

Es folgt mein ProgrammGoogle App Engine: Art Fehler

import os  
import jinja2  
import re  
from string import letters  
import webapp2  
from google.appengine.ext import db 

template_dir= os.path.join(os.path.dirname(__file__),'templates') 
jinja_env= jinja2.Environment(loader= jinja2.FileSystemLoader(template_dir),autoescape= True) 

class Handler(webapp2.RequestHandler): 
    def write(self,*a,**kw): 
     self.response.write(*a,**kw) 

    def render_str(self,template, **params): 
     t= jinja_env.get_template(template) 
     return t.render(params) 

    def render(self,template, **kw): 
     self.write(self.render_str(template,**kw)) 

def blog_key(name = "default"): 
    return db.Key.from_path('blogs',name) 

class Post(db.Model): 
    title= db.StringProperty(required= True) 
    content= db.TextProperty(required= True) 
    created= db.DateTimeProperty(auto_now_add= True) 
    edited= db.DateTimeProperty(auto_now= True) 

    def render(self): 
     self._render_text= self.content.replace('\n', '<br>') 
     return render_str("blogs.html", p= self) 

class BlogFront(Handler): 
    def get(self): 
     posts= db.GqlQuery("select * from posts order by desc limit 10") 
     self.render("front.html", posts=posts) 

#for a link to the new posts created 
class PostPage(Handler): 
    def get(self, post_id): 
     key= db.Key.from_path("Post", int(post_id), parent= blog_key()) 
     post=db.get(key) 

     if not post: 
      self.error(404) 
      return 

     self.render("permalink.html", post=post) 

#for new blog entries 
class NewPost(Handler): 
    def get(self): 
     self.render('newpost.html') 

    def post(self): 
     title= self.request.get("title") 
     content= self.request.get("content") 

     if title and content: 
      p= Post(parent= blog_key(), title=title, content=content) 
      p.put() 

      self.redirect('/blogs/%s' % str(p.key().id())) 
     else: 
      error= "Please write both title and content!!" 
      self.render("newpost.html",title=title, content=content, error=error) 

app = webapp2.WSGIApplication([ 
     ('/blog/newpost', NewPost), 
     ('/blogs/?',BlogFront), 
     ('/blogs/([0-9]+)',PostPage), #anything in the bracket will be passed as the parameter 

], debug=True) 

Aber wenn ich versuche, dieses Programm zu implementieren, erhalte ich folgende Fehlermeldung:

File "C:\Users\tan31102\AppData\Local\Google\Cloud SDK\google-cloud-sdk\platfo rm\google_appengine\google\appengine\ext\db__init__.py", line 299, in class_for _kind raise KindError('No implementation for kind \'%s\'' % kind) KindError: No implementation for kind 'posts'

Kann jemand bitte helfen ich damit.

Antwort

0

zu verwenden Sie müssen die Modelldefinition in der Py-Datei importieren, die es verwendet. Dies verursacht die KindError.

from posts import posts

oder etwas ähnliches.

Es klingt, als ob Sie versuchen, eine posts Einheit aus einer Sitzung zu laden, ohne zuerst das Modell posts zu importieren.

Um sicherzustellen, dass posts verfügbar ist, wenn die Sitzungs-Middleware ausgeführt wird, müssen Sie das Modell posts in Ihr Skript importieren.

+1

Vielen Dank @Abhinav. Es funktionierte für mich :) –

+0

Froh, @ Taylor zu helfen. Schreiben Sie weiter und bleiben Sie glücklich! Prost. Hoffe, dein Projekt ist ein Erfolg. –

1

Ihre gql verwendet Post im Plural - "Beiträge"

select * from posts order by desc limit 1

während die db.Model Klasse, die Sie Beiträge in Singularform erklärt haben, verwendet (Post)

class Post(db.Model): 

Sie benötigen bei jeder Form bleiben. Außerdem sollten Sie in Erwägung ziehen, ndb.Model anstelle von db.Model as stated in the docs

+0

Danke @Arne. Das war ein dummer Fehler. Aber das löst das Problem nicht. Ich bekomme immer noch Fehler beim Ausführen des Programms –