text: from flask import render_template, redirect, request, url_for, flash, current_app, make_response
  from flask_login import login_user, logout_user, login_required, current_user
  from . import main
  from ..models import User, Role, Permission, Post, Comment
  from .forms import EditProfileForm, EditProfileAdminForm, PostForm, CommentForm
  from .. import db
  from ..decorators import admin_required, permission_required
  
  
  @main.route('/', methods=['GET', 'POST'])
  def index():
      form = PostForm()
      if not current_user.is_anonymous:
          if form.validate_on_submit() and \
                  current_user.can(Permission.WRITE_ARTICLES) :
              print(form.body)
              post = Post(
                  body=form.body.data,
                  author=current_user._get_current_object()
              )
              db.session.add(post)
              db.session.commit()
              return redirect(url_for('.index'))
      #posts = Post.query.order_by(Post.timestamp.desc()).all()
      page = request.args.get('page', 1, type=int)
  
      # 显示关注用户的博文
      show_followed = False
      if current_user.is_authenticated:
          show_followed = bool(request.cookies.get('show_followed', ''))
      if show_followed:
          query = current_user.followed_posts
      else:
          query = Post.query
  
      #print("***show_followed***")
      #print(show_followed)
      pagination = query.order_by(Post.timestamp.desc()).paginate(
          page,
          per_page=current_app.config['FLASKY_POSTS_PER_PAGE'],
          error_out=False
      )
      posts = pagination.items
      return render_template(
          'index.html', form=form, posts=posts, show_followed=show_followed, pagination=pagination
      )
  
  @main.route('/all')
  @login_required
  def show_all():
      resp = make_response(redirect(url_for('.index')))
      resp.set_cookie('show_followed', '', max_age=30*24*60*60)
      return resp
  
  @main.route('/followed')
  @login_required
  def show_followed():
      resp = make_response(redirect(url_for('.index')))
      resp.set_cookie('show_followed', '1', max_age=30*24*60*60)
      return resp
  
  
  @main.route('/user/<username>')
  def user(username):
      user = User.query.filter_by(username=username).first()
      if user is None:
          abort(404)
      #posts = user.posts.order_by(Post.timestamp.desc()).all()
      page = request.args.get('page', 1, type=int)
      pagination = user.posts.order_by(Post.timestamp.desc()).paginate(
          page,
          per_page=current_app.config['FLASKY_POSTS_PER_PAGE'],
          error_out=False
      )
      posts = pagination.items
      return render_template('user.html', user=user, posts=posts, pagination=pagination)
  
  @main.route('/edit-profile', methods=['GET', 'POST'])
  @login_required
  def edit_profile():
      form = EditProfileForm()
      if form.validate_on_submit():
          current_user.name = form.name.data
          current_user.location = form.location.data
          current_user.about_me = form.about_me.data
          db.session.add(current_user)
          db.session.commit()
          flash('您的资料已更新.')
          return redirect(url_for('.user', username=current_user.username))
      form.name.data = current_user.name
      form.location.data = current_user.location
      form.about_me.data = current_user.about_me
      return render_template('edit_profile.html', form=form)
         
  @main.route('/edit-profile/<int:id>', methods=['GET', 'POST'])
  @login_required
  @admin_required
  def edit_profile_admin(id):
      user = User.query.get_or_404(id)
      form = EditProfileAdminForm(user=user)
      if form.validate_on_submit():
          user.email = form.email.data
          user.username = form.username.data
          user.confirmed = form.confirmed.data
          user.role = Role.query.get(form.role.data)
          user.name = form.name.data
          user.location = form.location.data
          user.about_me = form.about_me.data
          db.session.add(user)
          db.session.commit()
          flash('{}的资料已更新.'.format(user))
          return redirect(url_for('.user', username=user.username))
      form.email.data = user.email
      form.username.data = user.username
      form.confirmed.data = user.confirmed
      form.role.data = user.role_id
      form.name.data = user.name
      form.location.data = user.location
      form.about_me.data = user.about_me
      return render_template('edit_profile.html', form=form)
  
  @main.route('/post/<int:id>', methods=['GET', 'POST'])
  def post(id):
      post = Post.query.get_or_404(id)
      form = CommentForm()
      if form.validate_on_submit():
          comment = Comment(
              body=form.body.data,
              post=post,
              author=current_user._get_current_object()
          )
          db.session.add(comment)
          db.session.commit()
          flash('你的评论已发表.')
          return redirect(url_for('.post', id=post.id, page=-1))
      page = request.args.get('page', 1, type=int)
      if page == -1:
          page = ( post.comments.count() -1) / \
              current_app.config['FLASKY_COMMENTS_PER_PAGE'] + 1
      pagination = post.comments.order_by(
          Comment.timestamp.asc()
      ).paginate(
          page,
          per_page=current_app.config['FLASKY_COMMENTS_PER_PAGE'],
          error_out=False
      )
      comments = pagination.items
      return render_template('post.html', posts=[post], form=form,
          comments=comments,
          pagination=pagination
      )
  
  @main.route('/edit/<int:id>', methods=['GET', 'POST'])
  @login_required
  def edit(id):
      post = Post.query.get_or_404(id)
      if current_user != post.author and \
              not current_user.can(Permission.ADMINISTER):
          abort(403)
      form = PostForm()
      if form.validate_on_submit():
          post.body = form.body.data
          db.session.add(post)
          db.session.commit()
          flash('博文已更新.')
          return redirect(url_for('.post', id=post.id))
      form.body.data = post.body
      return render_template('edit_post.html', form=form)
  
  @main.route('/follow/<username>')
  @login_required
  @permission_required(Permission.FOLLOW)
  def follow(username):
      user = User.query.filter_by(username=username).first()
      if user is None:
          flash('无该用户.')
          return redirect(url_for('.index'))
      if current_user.is_following(user):
          flash('你已经关注了该用户了.')
          return redirect(url_for('.user', username=username))
      current_user.follow(user)
      flash('你成功关注了 %s.' % username)
      return redirect(url_for('.user', username=username))
  
  @main.route('/unfollow/<username>')
  @login_required
  @permission_required(Permission.FOLLOW)
  def unfollow(username):
      user = User.query.filter_by(username=username).first()
      if user is None:
          flash('无该用户.')
          return redirect(url_for('.index'))
      if not current_user.is_following(user):
          flash('你还未关注该用户.')
          return redirect(url_for('.user', username=username))
      current_user.unfollow(user)
      flash('你成功取消关注了 %s.' % username)
      return redirect(url_for('.user', username=username))
  
  @main.route('/followers/<username>')
  def followers(username):
      """
          user TA的粉丝, 即关注TA的
      """
      user = User.query.filter_by(username=username).first()
      if user is None:
          flash('无该用户.')
          return redirect(url_for('.index'))
      page = request.args.get('page', 1, type=int)
      pagination = user.followers.paginate(
          page, per_page=current_app.config['FLASKY_FOLLOWERS_PER_PAGE'],
          error_out=False
      )
      follows = [
          {
              'user': item.follower,
              'timestamp': item.timestamp
          } 
          for item in pagination.items
      ]
      return render_template(
          'follows.html', user=user, title="的粉丝",
          endpoint='.followers', pagination=pagination,
          follows=follows
      )
  
  @main.route('/followed_by/<username>')
  def followed_by(username):
      """
          username TA的关注,即被TA关注
      """
      user = User.query.filter_by(username=username).first()
      if user is None:
          flash('无该用户.')
          return redirect(url_for('.index'))
      page = request.args.get('page', 1, type=int)
      pagination = user.followed.paginate(
          page, per_page=current_app.config['FLASKY_FOLLOWED_PER_PAGE'],
          error_out=False
      )
      follows = [
          {
              'user': item.followed,
              'timestamp': item.timestamp
          } 
          for item in pagination.items
      ]
      return render_template(
          'follows.html', user=user, title="的关注",
          endpoint='.followed_by', pagination=pagination,
          follows=follows
      )
  
  @main.route('/moderate')
  @login_required
  @permission_required(Permission.MODERATE_COMMENTS)
  def moderate():
      page = request.args.get('page', 1, type=int)
      pagination = Comment.query.order_by(Comment.timestamp.desc()).paginate(
          page, per_page=current_app.config['FLASKY_COMMENTS_PER_PAGE'],
          error_out=False)
      comments = pagination.items
      return render_template(
          'moderate.html',
          comments=comments,
          pagination=pagination,
          page=page
      )
  
  @main.route('/moderate/enable/<int:id>')
  @login_required
  @permission_required(Permission.MODERATE_COMMENTS)
  def moderate_enable(id):
      comment = Comment.query.get_or_404(id)
      comment.disabled = False
      db.session.add(comment)
      db.session.commit()
      return redirect(
          url_for(
              '.moderate',
              page=request.args.get('page', 1, type=int)
          )
      )
  
  @main.route('/moderate/disable/<int:id>')
  @login_required
  @permission_required(Permission.MODERATE_COMMENTS)
  def moderate_disable(id):
      comment = Comment.query.get_or_404(id)
      comment.disabled = True
      db.session.add(comment)
      db.session.commit()
      return redirect(
          url_for(
              '.moderate',
              page=request.args.get('page', 1, type=int)
          )
      )
  