1

所以我在Python中有以下代码GAE代码,它有点长,但基本上它允许用户发布到博客,然后将每个博客帖子保存到用户重定向到的永久链接,并且用户可以重新链接到永远。永久链接只是博客/(博客帖子ID)。因此,通过重定向方法在NewPost处理程序中创建永久链接(纠正我,如果我错了),然后在哪里存储这些永久链接的列表?以某种方式访问​​?因为我看不见它,所以这个部分让我有点绊倒。GAE商店永久链接在哪里?

我从Udacity.com学到了所有这些代码,但他们没有真正解释这一点,我可以让它工作,但不明白它是如何工作的。

import os 
import re 
from string import letters 

import webapp2 
import jinja2 

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) 

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

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

    def render_str(self, template, **params): 
     return render_str(template, **params) 

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

def render_post(response, post): 
    response.out.write('<b>' + post.subject + '</b><br>') 
    response.out.write(post.content) 

#front page 
class MainPage(BlogHandler): 
    def get(self): 
     self.write('Hello, Udacity!') 

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

#creates the database 
class Post(db.Model): 
    subject = db.StringProperty(required = True) 
    content = db.TextProperty(required = True) 
    created = db.DateTimeProperty(auto_now_add = True) 
    last_modified = db.DateTimeProperty(auto_now = True) 

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

#front of blog with list of last 10 posts 
class BlogFront(BlogHandler): 
    def get(self): 
     posts = db.GqlQuery("select * from Post order by created desc limit 10") 
     self.render('front.html', posts = posts) 

#displays the permalink page 
class PostPage(BlogHandler): 
    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) 

#create a new post 
class NewPost(BlogHandler): 
    def get(self): 
     self.render("newpost.html") 

    def post(self): 
     subject = self.request.get('subject') 
     content = self.request.get('content') 

     if subject and content: 
      p = Post(parent = blog_key(), subject = subject, content = content) 
      p.put() 
      self.redirect('/blog/%s' % str(p.key().id())) 
     else: 
      error = "subject and content, please!" 
      self.render("newpost.html", subject=subject, content=content, error=error) 


app = webapp2.WSGIApplication([('/', MainPage), 
           ('/unit2/welcome', Welcome), 
           ('/blog/?', BlogFront), 
           ('/blog/([0-9]+)', PostPage), 
           ('/blog/newpost', NewPost), 
           ], 
           debug=True) 

UPDATE:

是否可以更改代码以下列方式,使其多了几分搜索引擎friendy:

class NewPost(BlogHandler): 
    def get(self): 
     self.render("newpost.html") 

    def post(self): 
     subject = self.request.get('subject') 
     content = self.request.get('content') 

     if subject and content: 
      p = Post(parent = blog_key(), subject = subject, content = content) 
      p.put() 
      #the change is in the following line: 
      self.redirect('/blog/%s/%s' % (str(p.key().id(), str(p.subject))) 
     else: 
      error = "subject and content, please!" 
      self.render("newpost.html", subject=subject, content=content, error=error) 

最后更新:

我解决了使用以下代码使搜索引擎更友好的问题:

def post(self): 
      subject = self.request.get('subject') 
      content = self.request.get('content') 

     if subject and content: 
      p = Post(parent = blog_key(), subject = subject, content = content) 
      p.put() 
      subject = p.subject 
      subject = subject.replace(' ', '25fdsa67ggggsd5') 
      subject = ''.join(e for e in subject if e.isalnum()) 
      subject = subject.replace('25fdsa67ggggsd5', '-') 
      subject = subject.lower() 
      self.redirect('/blog/%s/%s' % (str(p.key().id(), str(subject))) 
     else: 
      error = "subject and content, please!" 
      self.render("newpost.html", subject=subject, content=content, error=error) 
+1

没有链接存储在任何地方;只有一个“/ blog /”处理程序,后面跟着一个数字,用该ID显示帖子。 – geoffspear

+0

没关系,但以迂回的方式将ID存储在数据库中,以便信息来自 – clifgray

+0

ID实际上并未存储在数据库中,本身;它是Key的一部分,不是一个单独的值。 – geoffspear

回答

3

博客帖子的ID是在数据存储区前检索它所需的全部内容,因此不需要任何类型的映射。请求包含永久链接URL,ID从URL中提取,使用ID从数据存储中检索帖子,呈现博客文章。

这是一个简单而有效的策略,但其中一个平坦的地方是搜索引擎优化。大多数搜索引擎会选择一个包含单词的网址,而不仅仅是一串数字和字符。

这通常被称为重击,它会要求您提供ID和字符串之间的映射。几年前,我编写了一个mixin类,为AppEngine/Python程序提供了轻松的段落:sluggable-mixin。它应该仍然有效。

+0

好的真棒。你知道是否知道如果检索标题并在URL中使用该标题是否有效,或者只是没有重复,可以使用标题/标识。 – clifgray

+0

对不起,但我真的不明白你的问题。 –

+0

我刚刚更新了我正在谈论的代码。 – clifgray