Python的Flask框架中实现登录用户的个人资料和头像的教程

以下是Python Flask框架实现用户个人资料和头像的教程攻略,分为两部分:

  1. 用户个人资料的实现

1.1 创建用户资料模型

首先,我们需要在数据库中创建一个用户资料模型(model),用来存储用户个人信息。模型主要包括以下几个字段:用户名、电子邮箱、密码、性别、生日等等。具体实现可参考以下代码:

from flask_login import UserMixin
from datetime import datetime
from your_app_name import db, login_manager

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)
    gender = db.Column(db.String(6))
    birthday = db.Column(db.DateTime, default=datetime.utcnow)
    avatar = db.Column(db.String(20), nullable=False, default='default.jpg')

1.2 创建用户资料表单

接下来,我们需要为用户资料创建一个表单,这个表单主要包含用户资料的各项数据。用户可以通过这个表单进行修改和更新个人资料。具体实现可参考以下代码:

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import StringField, PasswordField, BooleanField, SubmitField, SelectField, DateField, TextAreaField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from flask_login import current_user
from your_app_name.models import User

class UpdateAccountForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Email', validators=[DataRequired(), Email()])
    gender = SelectField('Gender', choices=[('Male', 'Male'), ('Female', 'Female')])
    birthday = DateField('Birthday')
    picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])])
    submit = SubmitField('Update')

    def validate_username(self, username):
        if username.data != current_user.username:
            user = User.query.filter_by(username=username.data).first()
            if user:
                raise ValidationError('That username is taken. Please choose a different one.')

    def validate_email(self, email):
        if email.data != current_user.email:
            user = User.query.filter_by(email=email.data).first()
            if user:
                raise ValidationError('That email is taken. Please choose a different one.')

1.3 创建用户资料视图

最后,我们需要为用户资料创建一个视图(view),让用户能够在网页上查看和修改自己的个人信息。具体实现可参考以下代码:

from flask import render_template, url_for, flash, redirect, request
from flask_login import login_required, current_user
from your_app_name import app, db, bcrypt
from your_app_name.forms import UpdateAccountForm
from your_app_name.models import User

@app.route('/account', methods=['GET', 'POST'])
@login_required
def account():
    form = UpdateAccountForm()
    if form.validate_on_submit():
        if form.picture.data:
            picture_file = save_picture(form.picture.data)
            current_user.avatar = picture_file
        current_user.username = form.username.data
        current_user.email = form.email.data
        current_user.gender = form.gender.data
        current_user.birthday = form.birthday.data
        db.session.commit()
        flash('Your account has been updated!', 'success')
        return redirect(url_for('account'))
    elif request.method == 'GET':
        form.username.data = current_user.username
        form.email.data = current_user.email
        form.gender.data = current_user.gender
        form.birthday.data = current_user.birthday
    image_file = url_for('static', filename='profile_pics/' + current_user.avatar)
    return render_template('account.html', title='Account',
                           image_file=image_file, form=form)
  1. 用户头像的实现

2.1 保存用户头像

用户头像(avatar)一般是以图片的形式呈现,因此我们需要一个保存用户头像的功能,以保证用户更新或上传头像后,程序能够正常保存并显示最新的头像。

import os
import secrets
from PIL import Image
from flask import current_app

def save_picture(form_picture):
    random_hex = secrets.token_hex(8)
    _, f_ext = os.path.splitext(form_picture.filename)
    picture_filename = random_hex + f_ext
    picture_path = os.path.join(current_app.root_path, 'static/profile_pics', picture_filename)

    output_size = (125, 125)
    i = Image.open(form_picture)
    i.thumbnail(output_size)

    i.save(picture_path)

    return picture_filename

2.2 修改用户资料表单

用户头像的上传和更新是通过表单实现的,因此我们需要在UpdateAccountForm中添加picture字段:

class UpdateAccountForm(FlaskForm):
    # ...
    picture = FileField('Update Profile Picture', validators=[FileAllowed(['jpg', 'png'])])
    submit = SubmitField('Update')

2.3 修改用户资料视图

最后,在account视图中添加保存用户头像的逻辑和显示头像的代码:

from your_app_name.utils import save_picture

# ...

@app.route('/account', methods=['GET', 'POST'])
@login_required
def account():
    form = UpdateAccountForm()
    if form.validate_on_submit():
        if form.picture.data:
            picture_file = save_picture(form.picture.data)
            current_user.avatar = picture_file
        # ...
    image_file = url_for('static', filename='profile_pics/' + current_user.avatar)
    return render_template('account.html', title='Account',
                           image_file=image_file, form=form)

至此,Python Flask框架实现用户个人资料和头像的教程攻略就结束了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python的Flask框架中实现登录用户的个人资料和头像的教程 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • flask框架中勾子函数的使用详解

    现在我将为您详细讲解“flask框架中勾子函数的使用详解”的完整攻略,包含两条示例说明。以下是完整攻略: 什么是勾子函数 勾子函数(Hook Function),也叫回调函数(Callback Function),指的是在程序执行不同阶段,程序员预先设定并注册的、可以被主程序调用执行的函数。在 Flask 框架中,所有与请求和响应相关的操作都与 Reques…

    Flask 2023年5月15日
    00
  • 带你用Python实现Saga 分布式事务的方法

    首先我们先来介绍什么是Saga分布式事务。 Saga分布式事务简介 Saga是目前一种常用的分布式事务解决方案,它弥补了传统两阶段提交协议2PC存在的一些问题,比如性能瓶颈、可扩展性差等问题。 Saga解决方案的核心思想就是将一个大的分布式事务进一步拆分成多个子事务,并将这些子事务串联成一条事务流程,即Saga流程,以完成整个分布式事务。每个子事务完成时都会…

    Flask 2023年5月16日
    00
  • .net任务调度框架FluentScheduler简介

    .NET任务调度框架FluentScheduler简介 简介 FluentScheduler是一款基于.NET的任务调度框架,可以提供简单易用的API,支持多种类型的任务,可以满足各种复杂的任务调度需求。使用FluentScheduler可以省去很多手动编写任务调度代码的工作,提高了编码效率。 安装 使用NuGet包管理器或在Visual Studio的包管…

    Flask 2023年5月16日
    00
  • Flask框架URL管理操作示例【基于@app.route】

    下面我将为您详细讲解”Flask框架URL管理操作示例【基于@app.route】”的完整攻略,其中包括两条示例说明。 Flask框架URL管理操作示例【基于@app.route】 在Flask框架中,基于@app.route装饰器可以实现对URL的管理操作。使用这个装饰器,我们可以非常方便地指定URL地址,并将其与相应的函数绑定起来。下面是两个具体的示例:…

    Flask 2023年5月16日
    00
  • Flask 使用Gunicorn部署服务介绍

    下面将详细讲解“Flask 使用 Gunicorn 部署服务介绍”的完整攻略。 一、前置条件 在开始部署 Flask 服务之前,需要确保以下软件已经安装在服务器上: Python 3.x pip virtualenv Gunicorn 可以执行以下命令检查软件是否已经安装: python3 –version pip –version virtualenv…

    Flask 2023年5月15日
    00
  • flask中的wtforms使用方法

    下面是有关Flask中使用WTForms的详细攻略。 WTForms简介 WTForms是一个Python第三方库,用于构建Web表单。它为表单字段提供了类型安全、数据验证和呈现模板的便捷方法。WTForms还提供了可扩展的表单字段和验证器,以方便自定义表单实现。 此外,WTForms还具有与Flask框架的集成。因此,在Flask应用程序中使用WTForm…

    Flask 2023年5月16日
    00
  • Flask-WTF表单的使用方法

    Flask-WTF是一个在Flask中使用表单的第三方扩展程序,它可以帮助我们在Flask中方便地处理表单数据并进行验证,避免了手动处理表单数据的繁琐过程。下面是Flask-WTF表单的使用方法: 安装Flask和Flask-WTF 首先安装需要的扩展程序,可以通过pip安装: pip install Flask pip install Flask-WTF …

    Flask 2023年5月15日
    00
  • 手把手教你利用Python创建一个游戏窗口

    我很乐意为你讲解如何利用Python创建一个游戏窗口的完整攻略。请注意,为了让回答更加易于阅读,下文将使用标题、代码块等Markdown格式进行排版。 准备工作 在创建游戏窗口之前,我们需要安装pygame库,该库可以帮助我们方便地创建游戏窗口。你可以使用以下命令在终端中安装该库: pip install pygame 安装完成后,我们可以开始创建游戏窗口了…

    Flask 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部