我们来详细讲解一下“Flask 上传自定义头像的实例详解”的完整攻略。
1. 确定需求
首先,我们需要明确我们的需求,即用户能够上传自己的头像,并在用户页面中显示。这个功能可以分为两个部分:
- 用户头像上传:用户需要有一个页面来上传头像,并把上传的头像保存在服务器上。
- 用户头像显示:用户上传了头像后,在用户页面中可以显示出来。
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技术站