首先创建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. Dev控件工具箱安装

    安装目录\Components\Tools,打开命令行 安装DEV工具 $ ToolboxCreator.exe /ini:toolboxcreator.ini 移除DEV工具 $ ToolboxCr ...

  2. 【转】LINQ to SQL语句(1)之Where

    Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形 ...

  3. Servlet中的初始化参数、上下文参数、以及@Resource资源注入

    配置初始化参数.上下文参数.以及使用@Resource注解进行资源注入,目的是为了降低代码的耦合度.当项目需求进行变更的时候,不需要反复更改源代码,只需更改web.xml文件即可. 一:Servlet ...

  4. arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup

    jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等 本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠 ...

  5. js构造方法

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Java ...

  6. python基础教程总结12——数据库

    1. Python 数据库 API 很多支持SQL标准的数据库在Python中都有对应的客户端模块.为了在提供相同功能(基本相同)的不同模块之间进行切换(兼容),Python 规定了一个标准的 DB ...

  7. Mongodb之failed to create service entry worker thread

    Mongodb "failed to create service entry worker thread" 错误. 系统:CentOS release 6.8 mongod.lo ...

  8. cookie存验证码时间,时间没走完不能再次点击

    <script> var balanceSeconds=getcookie('Num'); console.log(balanceSeconds) var timer; var isCli ...

  9. coredata栈

    上下文包含所有信息 NSManagedObjectModel The NSManagedObjectModel instance describes the data that is going to ...

  10. js各运算符的执行顺序

    本文原链接:https://www.sojson.com/operation/javascript.html https://www.jianshu.com/p/d569c6ca1060 JavaSc ...