flask-用户资料

首先创建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 %}
View Code

创建链接

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

用户级别的资料编辑器

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)
View Code

资料编辑的链接

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

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

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('用户名已在使用')
View Code

 

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

@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)
View Code

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

{% 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 %}
View Code

 

posted @ 2017-08-25 18:45  换季  阅读(285)  评论(0编辑  收藏  举报