class ComposeHandler(MainHandler): _re_tags_separator = re.compile(r'(\/|\\|\,|\ |\|){1,}') _time_delta = datetime.timedelta(hours=8) def initialize(self, *args, **kwargs): self.form = ComposeForm(self.request.arguments) def UTC2BeiJingTime(self, time): '''the server may be anywhere in the world, so we manually adjust the time''' return time + self._time_delta def BeiJing2UTCTime(self, time): return time - self._time_delta def separate_tags(self, tags_str): # first,converted to lowercase and # all of the separator is replaced with ` ` # second, strip repalced_str (sometimes user input tags :"linux,") # third, split with ` ` # more flexible than direct invoke `re.split` return self._re_tags_separator.sub(' ', tags_str.lower()).strip().split() @tornado.web.authenticated @gen.coroutine def get(self, title): post = yield Post.asyncQuery(title=title).first() self.form.create_time.data = \ self.UTC2BeiJingTime(datetime.datetime.utcnow()) if post: self.form.post_id.data = post.id self.form.title.data = post.title self.form.content.data = post.content self.form.markdown.data = post.markdown self.form.create_time.data = \ self.UTC2BeiJingTime(post.create_time) self.form.category.data = post.category.name self.form.tags.data = ','.join(post.tags) self.render("compose.html", form=self.form) @tornado.web.authenticated @gen.coroutine def post(self, title): if self.form.validate(): post = None if self.form.post_id.data: post = yield Post.asyncQuery(id=self.form.post_id.data).first() if post: post.modified_time = datetime.datetime.utcnow() else: post = Post() post.create_time = \ self.BeiJing2UTCTime(self.form.create_time.data) title = self.form.title.data.replace(' ', '-') content = self.form.content.data markdown_text = self.form.markdown.data tags = self.separate_tags(self.form.tags.data) category_str = self.form.category.data.capitalize() category = yield Category.asyncQuery(name=category_str).first() if not category: category = Category() category.name = category_str yield category.save() post.title = title post.content = content post.markdown = markdown_text post.category = category post.tags = tags post.author = self.current_user yield post.save() self.flash("compose finsh!") return self.redirect('/blog') self.render("compose.html", form=self.form)