首先创建User模型

class User(UserMixin,db.Model):
__tablename__ = 'users'
  #.. 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)

刷新用户访问时间

    def ping(self):
self.last_seen = datetime.utcnow()
db.session.add(self)

app/auth/views.py :更新已登录用户的访问时间

@auth.before_app_request
# def before_request():
# if current_user.is_authenticated:
# current_user.ping()
# if not current_user.confirmed \
# and request.endpoint[:5] != 'auth.' :
# return redirect(url_for('auth.unconfirmed'))

用户资料页面

app/main/views.py

@main.route('/user/<username>')
def user(username):
user = User.query.filter_by(username=username).first()
if user is None:
abort(404)
return render_template('user.html', user=user)

用户资料页面的模板

{% block page_content %}
<div class="page-header">
<h1>{{ user.username }}</h1>
</div>
{% if user.name or user.location %}
<p>
{% if user.name %}{{ user.name }}{% endif %}
{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
{% if user.location %}
From<a href="http://maps.google.com/?q={{ user.location }}">{{ user.location }}</a>
{% endif %}
</p>
{% endif %} {% if current_user.is_administrator() %}
<p><a href="mailto:{{ user.email }}" >{{ user.email }}</a></p>
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}
<p>
Member since {{ moment(user.member_since).format('L') }}.
Last seen {{ moment(user.last_seen).fromNow() }}
</p> {% endblock %}

创建链接

        {% if current_user.is_authenticated %}
<li><a href="{{ url_for('main.user',username=current_user.username) }}">个人资料</a></li>
{% endif %}

用户级别的资料编辑器

class EditProfieForm(FlaskForm):
name = StringField(u'昵称',validators=[Length(0,64)])
location = StringField(u'地址',validators=[Length(0,64)])
about_me = TextAreaField(u'个性签名')
submit = SubmitField(u'提交')

资料编辑页面

app/main/views.py

@main.route('/edit-profile',methods=['GET','POST'])
@login_required
def edit_profile():
form = EditProfieForm()
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(u'更新成功')
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)

资料编辑的链接

        {% if user == current_user %}
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}

管理员级别的资料编辑表单

app/main/forms.py

class EditProfieAdminForm(FlaskForm):
email = StringField(u'邮箱',validators=[Required(),Length(1,64),Email()])
username = StringField(u'用户名',validators=[Required(),Length(1,64),Regexp('^[A-Za-z][A-Za-z0-9_.]*$',0,u'用户名必须只有字母,数字,.,和下划线')])
confirmed = BooleanField('Confirmed')
role = SelectField('Role',coerce=int)
name = StringField(u'昵称',validators=[Length(0,64)])
location = StringField(u'地址',validators=[Length(0,64)])
about_me = TextAreaField(u'个性签名')
submit = SubmitField(u'提交') def __init__(self,user,*args,**kwargs):
super(EditProfieAdminForm,self).__init__(*args,**kwargs)
self.role.choices = [(role.id,role.name)
for role in Role.query.order_by(Role.name).all()]
self.user = user def valideate_email(self,field):
if field.data != self.user.username and \
User.query.filter_by(username=field.data).first():
raise ValueError('用户名已在使用')

管理员级别的资料编辑路由

@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 = EditProfieAdminForm(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(u'更新成功')
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,user=user)

管理员使用的资料编辑链接

{% if current_user.is_administrator() %}
{% if user == current_user %}
<a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
{% endif %}

flask-用户资料的更多相关文章

  1. Flask 学习 九 用户资料

    资料信息 app/models.py class User(UserMixin,db.Model): #...... name = db.Column(db.String(64)) location ...

  2. MVC5 网站开发之七 用户功能 3用户资料的修改和删除

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...

  3. 鼠标划过用户名时在鼠标右下角显示div展示用户资料

    最近做一个网站论坛,为了方便会员之间相互了解,又不想再做一个页面展示用户资料,就想到了鼠标划过用户名时在鼠标右下角显示div展示用户资料这个效果, 这里要注意的该方法不是给每个用户名的旁边都绑定一个d ...

  4. 解决Discuz“完善用户资料”任务不能完成的问题

    最近用 Discuz X3.2 搭建了个论坛,在测试过程中发现"完善用户资料"这个官方自带的任务有个Bug,将所有的资料都填写完成后,任务仍然无法完成,而且没有明确提示有哪些项目没 ...

  5. 【转】【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  6. discuz论坛用户资料采集器

    discuz论坛用户资料采集器, 自动采集用户信息!

  7. 【Android应用开发详解】实现第三方授权登录、分享以及获取用户资料

      由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相 ...

  8. 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图

    [Android应用开发详解]第01期:第三方授权认证(一)实现第三方授权登录.分享以及获取用户资料   由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折, ...

  9. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)

    一.显示注册表单 1.访问资源 @Test public void shouldShowRegistration() throws Exception { SpitterRepository mock ...

  10. facebook 用curl获取用户资料

    用facebook获取用户信息 $graph_url= "https://graph.facebook.com/me?scope=email&fields=id,name,email ...

随机推荐

  1. 机器学习框架ML.NET学习笔记【8】目标检测(采用YOLO2模型)

    一.概述 本篇文章介绍通过YOLO模型进行目标识别的应用,原始代码来源于:https://github.com/dotnet/machinelearning-samples 实现的功能是输入一张图片, ...

  2. 六,IO系统

    六,IO系统 一,数据源 1,数据源--管道确认使用那根管道--节点流 2,先确定管道在tey中new出管道,new出后就写关闭代码,写完关闭代码在写中间代码 3,取数据和放数据结束语句必须有两个,不 ...

  3. Linq 根据list属性去重复

    s.Where((x, i) => s.FindIndex(z => z.ArticleTitle == x.ArticleTitle) == i).ToList();

  4. log4j.properties配置详情

    log4j: log for java 是Apache的一个开源项目! 00.将我们的日志信息,输出到指定的位置(控制台   文件中) 01.我们可以控制每一条日志的输出格式 02.我们设置日志信息的 ...

  5. SQLServer 2012 报表服务部署配置(2)

    2.当系统打开"SQL Server安装中心",则说明我们可以开始正常的安装SQL Server 2012,可以通过"计划"."安装".&q ...

  6. AutoIt上传非input控件方式的文件脚本

    AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...

  7. typescript设置全屏

    fullScreen() { document.getElementById("fullScreen").style.display = "none"; doc ...

  8. ovx openVirtex安装

    搞了好久的pox实验,中途一个星期没更新了吧, 今天继续... 新手第一次搞还是在虚拟机上最安全~ ovx参照上面的做吧,注意必须在联网的情况下,否则很多控件都连不上(第一次做的时候虚拟机没配ip 坑 ...

  9. 01_10_SERVLET如何连接Mysql数据库

    01_10_SERVLET如何连接Mysql数据库 1. 实现类 public void doGet(HttpServletRequest request, HttpServletResponse r ...

  10. 03_10_Object类的toString equals等方法

    03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...