10.1 编写用户页面

我们访问不同用户的页面, 显示不同的信息, 但是用户页面的大体架构都是相同的, 这是怎么做到的呢?

其实我们只要编写一个用户页面user.html, 然后返回模板的时候把当前登录的用户current_user作为参数传进模板, 模板就会显示该用户的各个属性, 不同用户的属性不同, 显示的内容也就不尽相同了。

一. 为User表增加属性

#为了使用户资料更丰富一些, 我们为用户增加几个属性:

from flask_login import UserMixin

from . import db

from datetime import datetime

class User(UserMixin, db.Model):

    name = db.Column(db.String(64))  #真实姓名

    location = db.Column(db.String(64))  #地址

    about_me = db.Column(db.Text())  #自我介绍

    member_since = db.Column(db.DateTime(), default=datetime.utcnow)   #注册时间

    last_seen = db.Column(db.DateTime(), default=datetime.utcnow)  #上次登录的时间

    #注册时间和上次登录时间默认都是注册的时间, 用户注册时, 视图函数创建用户, 然后提交会话到数据库, 此时用户的member_since和last_seen都是注册时的时间, member_since以后不需改动, 而last_seen是上次登录时间, 所以我们每次登录都要更新last_seen的值——具体做法是增加一个改变last_seen的函数, 然后在before_app_request中调用该函数。

   def ping(self):  

        self.last_seen = datetime.utcnow()

        db.session.add(self)


二. 修改|-app/-auth/views.py

from . import auth

from flask import requests, redirect, url_for

@auth.before_app_request  #在所有请求之前调用该函数

def before_request():

    if current_user.is_authenticated():  #有用户登录就更新该用户的last_seen属性的值为当前时间

        current_user.ping()

        if not current_user.confirm\

            and requests.endpoint[:5] != 'auth.':

                return redirect(url_for('auth.unconfirmed'))


三. 修改|-app/-main/views.py

from . import main

from ..models import User

from flask import abort, render_template

@main.route('/user/<username>')

def user(username): 
    #数据库存在该用户返回用户页面, 不存在返回404
    user = User.query.filter_by(username=username).first() 
    if not user:

        abort(404)

    return render_template('user.html', user=user)

四. 增加user.html页面——app/templates/user.html

{% extends 'base.html' %}

{% block title %}Flask - {{ user.username }}{% endblock %}

{% block page_content %}

<div class="page-header">

<h1>{{ user.username }}</h1>

{% if user.name or user.location %}  #用户有name或者location属性才有p标签

<p>

  {% if user.name %}{{user.name}}{% endif %}

  {% if user.location %}
   #用户有location属性, 显示一个连接, 谷歌地图搜索该地址的链接
    From<a href="http://maps.google.com/?q={{ user.location }}">{{ user.location }}</a>

  {% endif %}

</p>

{% endif %}
#用户为管理员, 显示管理员的email连接, 方便联系管理员
{% if user.is_administrator() %}<p><a href="mailto:{{ user.email }}">{{ user.email }}</a></p>{% endif %}

{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}

<p>

    Member since {{ moment(user.member_since).format('L') }}.  #显示用户注册时间

    Last seen {{ moment(user.last_seen).formNow() }}.  #显示距离用户上次登录的时间

</p>

</div>

{% endblock %}

五. 修改base.html——在导航条上添加个人页面链接

{% if current_user.is_authenticated() %}     #只有在用户登录以后, 导航栏才显示该连接, 防止匿名用户访问该连接

<li>

<a href="{{ url_for('main.user', username=current_user.username) }}">Profile</a>

</li>

{% endif %}

用户可以分享自己页面的url给别人浏览, 也可以登录自己的账号, 然后点击Profile链接浏览自己的页面;

六. 效果演示

我们首先注册一个用户john:

注意我们提供的email无效, 所以无法完成验证, 为了跳过请求前重定向到unconfirmed, 我们把confirm字段改为1, 登录用户:

点击提交按钮后, auth.login视图函数返回重定向main.index, 在处理main.index 请求之前先执行before_app_request钩子函数, 把john的last_seen字段修改为当前时间, 然后处理main.index请求, 返回主页index.html, 由于此时用户已经登录, 于是导航栏显示Profile链接:

点击链接, 返回用户页面user.html, 显示用户信息:






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值