flask+pymysql上传个人用户头像
时间: 2024-09-30 11:05:12 浏览: 49
在Flask框架中结合Pymysql处理用户头像上传,通常会涉及以下几个步骤:
1. **设置环境**:
首先需要安装Flask、Flask-WTF(用于表单处理)和Flask-Uploads(用于文件上传)等库。你可以通过`pip install Flask Flask-WTF Flask-Uploads PyMySQL`命令安装。
2. **配置数据库连接**:
使用Pymysql建立到MySQL数据库的连接,在Flask应用的配置文件(如`config.py`)中设置数据库相关的配置信息,比如主机、用户名、密码和数据库名。
```python
from sqlalchemy import create_engine
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://username:password@localhost/db_name"
engine = create_engine(SQLALCHEMY_DATABASE_URI)
```
3. **创建模型**:
定义一个User模型,包含头像URL字段,并继承自flask_sqlalchemy.Model。
```python
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
from flask_uploads import UploadSet, configure_uploads, IMAGES
db = SQLAlchemy()
avatar = UploadSet('avatars', IMAGES)
app.config['UPLOADED_PHOTOS_DEST'] = 'static/user_avatars'
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
avatar_file = db.Column(db.String(255))
avatar_url = db.relationship('Avatar', backref='user', uselist=False)
class Avatar(db.Model):
id = db.Column(db.Integer, primary_key=True)
filename = db.Column(db.String(255), unique=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
```
4. **路由和视图函数**:
创建上传头像的路由和处理文件上传的视图函数。这里使用Flask-WTF的FileField。
```python
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from wtforms.validators import DataRequired
class ProfileForm(FlaskForm):
avatar = FileField("选择头像", validators=[DataRequired()])
submit = SubmitField("上传")
@app.route('/profile', methods=['GET', 'POST'])
def profile():
form = ProfileForm()
if form.validate_on_submit():
file = form.avatar.data
# 检查文件并保存
filename = secure_filename(file.filename)
avatar.save(file, name=filename)
# 更新数据库
user = User.query.get(current_user.id)
user.avatar_file = filename
db.session.commit()
return redirect(url_for('profile_success'))
return render_template('profile.html', form=form)
```
5. **模板和静态资源**:
创建HTML模板,让用户可以上传头像,然后展示已经上传成功的头像链接。
```html
<!-- profile.html -->
<form method="post" enctype=multipart/form-data>
<input type=file name=avatar>
<button type=submit>上传</button>
</form>
<p>Your uploaded image URL: {{ current_user.avatar_url }}</p>
```
6. **错误处理**:
要考虑文件大小限制、文件类型验证以及数据库操作异常的处理。
阅读全文