FlaskWeb/app/auth/views.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
from . import main
from ..models import Permission, User
from flask_login import login_required
from flask import render_template, redirect, url_for, abort
from ..decorators import admin_required, permission_required
@main.route('/admin')
@login_required
# @permission_required(Permission.ADMINISTER_POWER)
@admin_required
def admin():
return redirect(url_for('admin.index'))
@main.route('/user/<username>')
def user(username):
user = User.query.filter_by(username=username).first()
if not user:
abort(404)
return render_template('user.html', user=user)
@main.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
说明:为每个用户创建资料页面很简单,大多数Web程序为了方便搜索引擎抓取个人信息页面都无需登录即可直接读取,于是定义一个/user/<username>的路由,视图函数会在数据库中搜索URL中指定的用户名,并渲染user.html,并把用户名作为参数传入模版,不存在返回404,否则显示用户信息
FlaskWeb/app/templates/user.html
{%- extends 'base.html' -%}
{%- block page_content -%}
<div class="page-header">
{{ utils.flashed_messages(container=false, dismissible=true) }}
<h1>{{ user.username }}</h1>
{%- if user.name or user.location -%}
<p>
{%- if user.realname -%}{{ user.realname }}{%- endif -%}
{%- if user.location -%}
From <a href="http://map.baidu.com/?newmap=1&ie=utf-8&s=s%26wd%3D{{ user.location }}">{{ user.location }}</a>
{%- endif -%}
</p>
{%- endif -%}
{%- if current_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>
register time: {{ moment(user.register_date).format('L') }}
<br />
last access time: {{ moment(user.last_access_date).fromNow() }}
</p>
</div>
{%- endblock -%}
说明:realname和location字段在同一个<p>元素中渲染,只有至少定义这两个字段中的一个时<p>才会被创建,location字段被渲染成百度地图的查询链接,判断current_user是否是管理员,如果是则显示用户电子邮箱,并渲染成mailto链接
FlaskWeb/app/templates/base.html
{%- extends 'bootstrap/base.html' -%}
{%- import 'bootstrap/wtf.html' as wtf -%}
{%- import 'bootstrap/utils.html' as utils -%}
{%- import 'bootstrap/fixes.html' as fixes -%}
{%- block html_attribs -%}
{{ super() }}
lang="zh-cn"
{%- endblock -%}
{%- block meta -%}
{{ super() }}
charset="utf-8"
{%- endblock -%}
{%- block title -%}
{{ title|default('Flasky', true) }}
{%- endblock -%}
{%- block head -%}
{{ super() }}
{{ fixes.ie8() }}
<link rel="shortcut icon"
type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
<link rel="icon"
type="image/x-icon" href="{{ url_for('static', filename='favicon.ico') }}">
{%- endblock -%}
{%- block navbar -%}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
{# 说明: 先不支持响应式 #}
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div>
<ul class="nav navbar-nav navbar-left">
<li class="active"><a href="/">Home</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
{%- if current_user.is_authenticated -%}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ current_user.username }}<b class="caret"></b> </a>
<ul class="dropdown-menu">
<li><a href="{{ url_for('main.user', username=current_user.username) }}">个人信息</a></li>
<li><a href="{{ url_for('auth.logout') }}">退出登出</a></li>
</ul>
</li>
{%- else -%}
<li><a href="{{ url_for('auth.login') }}">登录</a></li>
<li><a href="{{ url_for('auth.register') }}">注册</a></li>
{%- endif -%}
</ul>
</div>
</div>
</div>
{%- endblock -%}
{%- block content -%}
<div class="container">
{%- block page_content -%}{%- endblock -%}
</div>
{%- endblock -%}
{%- block styles -%}
{{ super() }}
{%- endblock -%}
{%- block scripts -%}
<script type="text/javascript"
src="{{ url_for('main.static',filename='js/fixes/respond.min.js') }}"></script>
<script type="text/javascript"
src="{{ url_for('main.static',filename='js/fixes/html5shiv.min.js') }}"></script>
{{ super() }}
{{ moment.include_moment(local_js=url_for('main.static', filename='js/moment-with-locales.min.js')) }}
{%- endblock -%}
说明:大多数用户都希望能很轻松的访问自己的资料页面,所以我们修改下base.html基模版中的导航页面,使用下拉式导航,在下拉菜单中添加一个链接,链接到个人信息页面展示