首先创建User模型

  1. class User(UserMixin,db.Model):
  2. __tablename__ = 'users'
      #..
  3.  
  4. name = db.Column(db.String(64))
  5. location = db.Column(db.String(64))
  6. about_me = db.Column(db.Text())
  7. member_since = db.Column(db.DateTime(),default=datetime.utcnow)
  8. last_seen = db.Column(db.DateTime(),default=datetime.utcnow)

刷新用户访问时间

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

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

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

用户资料页面

app/main/views.py

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

用户资料页面的模板

  1. {% block page_content %}
  2. <div class="page-header">
  3. <h1>{{ user.username }}</h1>
  4. </div>
  5. {% if user.name or user.location %}
  6. <p>
  7. {% if user.name %}{{ user.name }}{% endif %}
  8. {% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
  9. {% if user.location %}
  10. From<a href="http://maps.google.com/?q={{ user.location }}">{{ user.location }}</a>
  11. {% endif %}
  12. </p>
  13. {% endif %}
  14.  
  15. {% if current_user.is_administrator() %}
  16. <p><a href="mailto:{{ user.email }}" >{{ user.email }}</a></p>
  17. <a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
  18. {% endif %}
  19. <p>
  20. Member since {{ moment(user.member_since).format('L') }}.
  21. Last seen {{ moment(user.last_seen).fromNow() }}
  22. </p>
  23.  
  24. {% endblock %}

创建链接

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

用户级别的资料编辑器

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

资料编辑页面

app/main/views.py

  1. @main.route('/edit-profile',methods=['GET','POST'])
  2. @login_required
  3. def edit_profile():
  4. form = EditProfieForm()
  5. if form.validate_on_submit():
  6. current_user.name = form.name.data
  7. current_user.location = form.location.data
  8. current_user.about_me = form.about_me.data
  9. db.session.add(current_user)
  10. db.session.commit()
  11. flash(u'更新成功')
  12. return redirect(url_for('.user',username=current_user.username))
  13. form.name.data = current_user.name
  14. form.location.data = current_user.location
  15. form.about_me.data = current_user.about_me
  16. return render_template('edit_profile.html', form=form)

资料编辑的链接

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

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

app/main/forms.py

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

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

  1. @main.route('/edit-profile/<int:id>',methods=['GET','POST'])
  2. @login_required
  3. @admin_required
  4. def edit_profile_admin(id):
  5. user = User.query.get_or_404(id)
  6. form = EditProfieAdminForm(user=user)
  7. if form.validate_on_submit():
  8. user.email = form.email.data
  9. user.username = form.username.data
  10. user.confirmed = form.confirmed.data
  11. user.role = Role.query.get(form.role.data)
  12. user.name = form.name.data
  13. user.location = form.location.data
  14. user.about_me = form.about_me.data
  15. db.session.add(user)
  16. db.session.commit()
  17. flash(u'更新成功')
  18. return redirect(url_for('.user',username=user.username))
  19. form.email.data = user.email
  20. form.username.data = user.username
  21. form.confirmed.data = user.confirmed
  22. form.role.data = user.role_id
  23. form.name.data = user.name
  24. form.location.data = user.location
  25. form.about_me.data = user.about_me
  26. return render_template('edit_profile.html',form=form,user=user)

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

  1. {% if current_user.is_administrator() %}
  2. {% if user == current_user %}
  3. <a class="btn btn-danger" href="{{ url_for('.edit_profile_admin',id=user.id) }}">Edit</a>
  4. {% 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. 【转载】【MVC 学习 Razor语法】

    Razor是MVC3中才有的新的视图引擎.我们知道,在ASP.NET中,ASPX的视图引擎依靠<%和%>来调用C#指令.而MVC3以后有了一套新的使用@标记的Razor语法,使用起来更灵活 ...

  2. leetcdoe Valid Anagram

    题目连接 https://leetcode.com/problems/valid-anagram/ Valid Anagram Description Given two strings s and ...

  3. 使用SharePreferences存取数据(慕课笔记 )

    0.视频地址:http://www.imooc.com/video/3265 1.使用SharePreferences存取数据: public class MainActivity extends A ...

  4. SqlServer 填充因子的说明

    CREATE NONCLUSTERED INDEX IX_d_name ON department(d_name) with fillfactor=30 使用 fill factor 选项可以指定 M ...

  5. SQL_关联映射

    关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角度来说多个球员属于一个球队 即为多对一 数据表间 ...

  6. Netweaver和CloudFoundry的服务器日志

    Netweaver 事务码SMICM,Goto->HTTP Plug-In->Server Logs: CloudFoundry 假设我部署本地应用到CloudFoundry之后,应用的状 ...

  7. UI EventSystem事件监听

    Unity5.0 EventSystem事件系统的详细说明 一.EventSystem对象的说明 当我们在场景中创建任一UI对象后,Hierarchy面板中都可以看到系统自动创建了对象EventSys ...

  8. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)

    预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在. 算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下 #include<bits/stdc+ ...

  9. UVA10410 TreeReconstruction 树重建 (dfs,bfs序的一些性质,以及用栈处理递归 )

    题意,给你一颗树的bfs序和dfs序,结点编号小的优先历遍,问你可能的一种树形: 输出每个结点的子结点. 注意到以下事实: (1)dfs序中一个结点的子树结点一定是连续的. (2)bfs,dfs序中的 ...

  10. js 获取当前年月日时分秒星期

    $("#aa").click(function () { var date = new Date(); this.year = date.getFullYear(); this.m ...