Flask 上传自定义头像的实例详解

我们来详细讲解一下“Flask 上传自定义头像的实例详解”的完整攻略。

1. 确定需求

首先,我们需要明确我们的需求,即用户能够上传自己的头像,并在用户页面中显示。这个功能可以分为两个部分:

  1. 用户头像上传:用户需要有一个页面来上传头像,并把上传的头像保存在服务器上。
  2. 用户头像显示:用户上传了头像后,在用户页面中可以显示出来。

2. 创建Flask应用

在开始编写代码之前,我们需要创建一个Flask应用。可以使用如下代码:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run()

这段代码会创建一个简单的Flask应用,并在访问根路径时返回“Hello, World!”的字符串,我们可以在这个应用的基础上开始编写我们的头像上传功能。

3. 用户头像上传

3.1. 创建上传页面

第一步,我们需要创建一个上传页面,让用户上传他们的头像。可以使用如下代码:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('upload.html')

if __name__ == '__main__':
    app.run()

这个代码会创建一个上传页面,并使用render_template()函数来渲染一个名为upload.html的HTML模板文件。我们需要在templates文件夹下创建一个名为upload.html的文件,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload Avatar</title>
</head>
<body>
    <h1>Upload Your Avatar</h1>
    <form action="/" method="post" enctype="multipart/form-data">
        <input type="file" name="avatar">
        <input type="submit" value="Upload">
    </form>
</body>
</html>

这个模板文件包含一个标题,一个表单和一个按钮。表单为提交类型,enctype属性为multipart/form-data,这是因为我们要上传一个文件。在表单中,我们有一个文件选择器和一个提交按钮。

3.2. 处理上传操作

第二步,我们需要处理用户提交的头像文件。可以使用如下代码:

from flask import Flask, render_template, request, redirect, url_for, flash
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)

app.config['SECRET_KEY'] = 'your_secret_key_here'
app.config['UPLOAD_FOLDER'] = './uploads'
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['avatar']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            flash('Upload success!')
            return redirect(url_for('index'))
        else:
            flash('Upload failed!')
    return render_template('upload.html')

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == '__main__':
    app.run()

这个代码添加了一个新的upload_file()函数,用来处理上传请求。首先,我们检查提交的请求是否为POST请求,如果是,我们取出上传的文件,并检查文件名是否合法。在我们的示例中,我们只接受以下文件类型:png、jpg、jpeg和gif。如果文件名不合法,我们提示上传失败;否则,我们使用secure_filename()函数来获取一个安全的文件名,并把文件保存到服务器本地文件夹./uploads中。保存完成后,我们给用户一个提示,让他们知道文件已经成功上传。最后,我们重定向到index()函数。注意,我们还需要在应用中添加一个新的uploads()函数,用来处理已经上传的文件,并将其显示在用户页面中。

4. 用户头像显示

4.1. 更新用户信息

第一步,我们需要更新用户信息,添加用户头像信息。可以使用如下代码:

from flask import Flask, render_template, request, redirect, url_for, flash
from werkzeug.utils import secure_filename
import os
import random

app = Flask(__name__)

app.config['SECRET_KEY'] = 'your_secret_key_here'
app.config['UPLOAD_FOLDER'] = './uploads'
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}

def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

class User:
    def __init__(self, username):
        self.username = username
        self.avatar = None

users = {}

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['avatar']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            flash('Upload success!')
            username = request.form.get('username')
            user = users.get(username)
            if user is None:
                user = User(username)
                users[username] = user
            user.avatar = filename
            return redirect(url_for('index'))
        else:
            flash('Upload failed!')
    return render_template('upload.html')

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

@app.route('/user/<username>')
def view_user(username):
    user = users.get(username)
    if user is None:
        return 'Invalid user!'
    else:
        return render_template('user.html', user=user)

@app.route('/users')
def view_users():
    return render_template('users.html', users=users)

@app.route('/random')
def random_user():
    keys = list(users.keys())
    username = random.choice(keys)
    return redirect(url_for('view_user', username=username))

@app.route('/delete/<username>')
def delete_user(username):
    user = users.pop(username, None)
    if user is None:
        return 'Invalid user!'
    else:
        return redirect(url_for('view_users'))

if __name__ == '__main__':
    app.run()

这个代码为User类添加一个avatar属性,并在头像上传完毕后更新用户信息。当用户上传他们的头像时,我们修改他们的User对象的avatar属性,并返回主页。注意,我们还需要添加一些新的函数来展示用户信息和用户列表,这些函数在下一步中进行讨论。

4.2. 创建用户页面

第二步,我们需要创建一个用户页面,用来展示用户的信息和头像。可以使用如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ user.username }}</title>
</head>
<body>
    <h1>{{ user.username }}</h1>
    {% if user.avatar %}
    <img src="{{ url_for('uploaded_file', filename=user.avatar) }}" alt="{{ user.username }}" width="100">
    {% else %}
    <p>No avatar.</p>
    {% endif %}
</body>
</html>

这个模板文件包含一个标题和一个条件渲染。如果用户有头像,我们展示该头像,否则我们展示一段“无头像”的文字信息。使用url_for()函数来为图片生成一个可访问的URL。

4.3. 创建用户列表

第三步,我们需要创建一个用户列表页面,用来展示所有用户和他们的信息。可以使用如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Users</title>
</head>
<body>
    <h1>Users</h1>
    {% for username, user in users.items() %}
    <p><a href="{{ url_for('view_user', username=username) }}">{{ username }}</a></p>
    {% endfor %}
</body>
</html>

这个模板文件包含一个标题和一个循环,用来展示所有的用户和他们的信息。对于每一个用户,我们展示他们的用户名和一个链接到他们的用户页面的链接。

5. 运行应用

最后一步,我们要运行我们的Flask应用。可以使用如下命令:

python app.py

这个命令会启动我们的Flask应用,并在端口5000上进行监听。我们可以在浏览器中访问http://localhost:5000来访问我们的应用。此时,在页面的顶部,我们可以看到一个上传头像的链接。点击这个链接,会跳转到我们之前创建的上传页面,我们可以在此上传自己的头像。上传完毕后,我们可以访问http://localhost:5000/user/username,来查看我们的头像和个人信息。我们还可以访问http://localhost:5000/users来查看所有的用户和他们的信息。

这就是我们的“Flask 上传自定义头像的实例详解”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask 上传自定义头像的实例详解 - Python技术站

(1)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Flask框架利用Echarts实现绘制图形

    下面我将为您详细讲解“Flask框架利用Echarts实现绘制图形”的完整攻略。 安装Flask和Echarts 首先,我们需要安装Flask和Echarts。可以通过Python的包管理工具pip进行安装。 pip install Flask Echarts 创建Flask应用程序 我们可以通过Flask框架来创建一个Web应用程序,可以通过以下Pytho…

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

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

    Flask 2023年5月16日
    00
  • flask-socketio实现前后端实时通信的功能的示例

    下面是使用flask-socketio实现前后端实时通信的完整攻略,包含两个示例说明: 环境安装 安装Python和pip 使用pip安装Flask和Flask-SocketIO,命令为: pip install flask flask-socketio 安装前端JavaScript库socket.io,可以通过以下命令,在项目根目录下建立一个新的stati…

    Flask 2023年5月16日
    00
  • python自动化测试中APScheduler Flask的应用示例

    以下是关于“python自动化测试中APScheduler Flask的应用示例”的详细讲解: 简介 APScheduler 是一个轻量级的 Python 定时任务调度框架,可以添加多个任务,可以动态添加修改和删除任务,先来看一下简单示例: from apscheduler.schedulers.blocking import BlockingSchedul…

    Flask 2023年5月16日
    00
  • 一文带你学会Python Flask框架设置响应头

    以下是详细的Python Flask框架设置响应头攻略。 什么是响应头? 在HTTP协议中,请求和响应分别由请求头和响应头两部分组成。其中,响应头包含一些元信息,用于描述响应中所包含的实体,如数据类型、编码方式等。 Flask框架设置响应头 在Python Flask框架中,设置响应头非常简单。可以通过Flask框架提供的make_response()函数手…

    Flask 2023年5月16日
    00
  • python之sqlalchemy创建表的实例详解

    首先,需要明确的是SQLAlchemy是一个Python编写的关系型数据库框架,可以方便地对数据库进行操作。在这样一个框架中创建表格非常容易,下面我将详细介绍如何使用SQLAlchemy创建一个表格。 环境搭建 在开始创建表格之前,你需要先安装SQLAlchemy模块。可以在命令行中输入以下命令安装: pip install sqlalchemy 依赖库安装…

    Flask 2023年5月16日
    00
  • Python的flask常用函数route()

    Python Flask的route()函数 @app.route(rule, options) 是flask框架中用于定义路由的装饰器,route()函数就是用来注册路由的。rule为路由匹配规则,options为路由附带属性,例如请求的方式限制、自定义的参数等。route()函数可以帮助我们将HTTP请求映射到一个具体的处理程序上。 下面是具体的示例: …

    Flask 2023年5月16日
    00
  • Flask中endpoint的理解(小结)

    Flask中的endpoint是指一个可重用的处理程序,以及与之关联的URL规则。Flask应用程序中的每个视图函数都可以被赋予一个endpoint,这个endpoint可以通过url_for()函数在应用程序中的任何地方进行访问。在下面的文本中,我们将详细讲解Flask中endpoint的理解,包括其作用以及使用方法。 作用 Flask的endpoint主…

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