项目班 07 Model与数据优化
html默认可以用直接用的方法和变量
{{ static_url(p.image_url) }} #static_url表示直接获取静态文件url {{ handler.current_user }} #handler.current_user表示直接获取用户名
handlers/main.py 更新
class IndexHandler(AuthBaseHandler): """ Home page for user,photo feeds 主页 """ @tornado.web.authenticated #如果没有登录(拿不到current_user),会自动跳转到 /login ,并把当前url加到next参数里面 def get(self,*arg,**kwargs): posts = get_post_for(self.current_user) #current_user 是获取get_current_user的用户名;然后拿到该用户的图片(是一个列表) self.render('index.html',posts = posts) #在index.html里面可以直接引用posts里面的image_url,id等 class ExploreHandler(AuthBaseHandler): """ Explore page,photo of other users 浏览简缩图 """ @tornado.web.authenticated def get(self,*arg,**kwargs): posts = get_all_posts() #获取所有图片 self.render('explore.html',posts=posts)#打开explore文件并将图片放上去
utils/account.py 更新
def add_post_for(username,image_url,thumb_url):#将路径保存到数据库 ''' 保存该用户的图片 ''' user = session.query(User).filter_by(name=username).first()#拿到user post = Post(image_url=image_url,thumb_url=thumb_url,user=user) session.add(post) session.commit() # return post.id def get_post_for(username): ''' 查看该用户图片 ''' user = session.query(User).filter_by(name=username).first() #获取用户名 # posts = session.query(Post).filter_by(user=user) #返回的是实例的对象,是一个列表list return user.posts #获取该用户名的posts ,这个posts = session.query(Post).filter_by(user=user), #因为在下面的Post表中relationship里面有外键约束backref='post',要查询posts的属性可以通过user.posts的方式来查找 def get_post(post_id): ''' 获取指定id的post ''' post = session.query(Post).get(post_id) #从数据库里面查找指定id的post return post def get_all_posts(): ''' 获取所有id的post ''' posts = session.query(Post).order_by(Post.id.desc()).limit(8) #order_by将id做下倒序排序,并且只显示最新的8个 # posts = session.query(Post).order_by(Post.id.desc())[:8] 这种方法也是可以的,前面posts取出来的是一个列表,通过[:8]的方法反序查询(切片) return posts
templates/index.html更新
{% extends 'base.html' %} {% block title %}index page{% end %} {% block content %} <div class="row"> <div class="col-12 text-center"> <h2>关注用户最新动态</h2> <p class="lead">最新上传的图片列表</p> </div> <div class="col-12 col-sm-8 offset-sm-1 align-self-center"> {% for p in posts %} {# 对posts里面的每个图片进行迭代,运行一次输出一个图片;静态路径访问:就是访问静态文件目录,通过静态路径来打开文件 后面static目录后面的目录就是服务器本地图片所存储的目录;还有就是handler访问,通过具体的handler来访问 #} <figure class="figure" style="max- 500px"> <a href="/post/{{ p.id }}"> {# 跳转到main.py下面的post路由,并用正则写入posts实例p的id,通过id来找寻该图片的储存路径,进而打开目录 #} <img src="{{ static_url(p.image_url) }}" class="figure-img img-fluid rounded" alt="a figure."> </a> <figcaption class="figure-caption">upload by {{ p.user.name }}</figcaption> </figure> {% end %} </div> </div> {% end %}
templates/post.html 更新
{% extends 'base.html' %} {% block title %}post page{% end %} {% block content %} <div class="row justify-content-center"> <div class="col-12 col-sm-10"> <img src="{{ static_url(post.image_url) }}" width="560px" /> <h4>{{ post.user.name }}在{{ post.created or '' }}上传</h4> </div> </div> {% end %}
templates/explore.html 更新
{% extends 'base.html' %} {% block title %}explore page{% end %} {% block content %} {% for p in posts%} <a href="/post/{{ p.id }}"> <img src="{{ static_url(p.thumb_url) }}" /> </a> {% end %} {% end %}