Я создаю блог на Python / Flask и реализовал функцию загрузки изображений для нового поста и для пользователей, которые хотят зарегистрироваться и получить фотографию профиля.
У меня все хорошо с загрузкой и получением фотографий для постов. Но теперь я хочу добавить возможность загружать также фотографии профиля и не понимаю, как назначать различные конечные точки (папки) для сообщений сообщений и изображений профиля. Я использую Flask -Загрузки для загрузки.
Вот мой код:
init.py
from flask_uploads import configure_uploads, IMAGES, UploadSet
basedir = os.path.abspath(os.path.dirname(__file__))
app = flask.Flask(__name__)
app.config['SECRET_KEY'] = 'sdjhgsjghlakjf'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir, "app.db")
app.config['UPLOADED_IMAGES_DEST'] = os.path.join(basedir, 'static/images')
images = UploadSet('images', IMAGES)
configure_uploads(app, images)
db = flask_sqlalchemy.SQLAlchemy(app)
from app import routes, models
forms.py
class NewPost(flask_wtf.FlaskForm):
topic = wtforms.SelectField('Choose the topic', choices=choices, validators=[DataRequired()])
heading = wtforms.StringField('Heading')
post_text = wtforms.StringField('Post text')
image = wtforms.FileField('Post image')
submit = wtforms.SubmitField('Post')
def create_post_object(self):
# Retrieve data from form
topic = self.topic.data
heading = self.heading.data
post_text = self.post_text.data
image = images.save(self.image.data)
# Creating a post
post = models.Post.create_post(topic=topic, heading=heading, post_text=post_text, post_image=image)
return post
class SignUp(flask_wtf.FlaskForm):
name = wtforms.StringField('Name: ', validators=[DataRequired()])
email = wtforms.StringField('E-mail: ', validators=[DataRequired()])
user_image = wtforms.FileField('Picture')
pwd = wtforms.PasswordField('Password: ', validators=[DataRequired()])
submit = wtforms.SubmitField('Sign Up')
def create_user(self):
"""
Creates new user
"""
# Retrieve data from form
name = self.name.data
email = self.email.data
pwd = self.pwd.data
user_image = images.save(self.user_image.data)
new_user = models.User.create_user(name=name, email=email, pwd=pwd, user_image=user_image)
sign_in_new_user_auto = models.User.sign_in(email, pwd, remember=True)
return new_user
models.py
class Post(db.Model):
post_id = db.Column(db.Integer, primary_key=True)
topic = db.Column(db.String(64))
heading = db.Column(db.String)
post_text = db.Column(db.String)
post_image = db.Column(db.String)
post_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
comments = db.relationship('Comment', backref='post')
@classmethod
def create_post(cls, topic=None, heading=None, post_text=None, post_time=None, post_image=None):
# Apply filters
topic = topic.lower()
# Create obj
new_post = models.Post(topic=topic, heading=heading, post_text=post_text, post_time=post_time, post_image=post_image)
db.session.add(new_post)
db.session.commit()
return new_post
class User(flask_login.UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
email = db.Column(db.String(64))
pwd = db.Column(db.String(64))
user_image = db.Column(db.String)
comments = db.relationship('Comment', backref='user') # one User may have many comments(one-to-many with Comments table)
def change_pwd(self, pwd):
hashed_pwd = generate_password_hash(pwd)
self.pwd = hashed_pwd
db.session.commit()
@classmethod
def create_user(cls, name=None, email=None, pwd=None, user_image=None):
"""
creates new user
"""
new_user = cls(name=name, email=email, user_image=user_image)
new_user.change_pwd(pwd)
db.session.add(new_user)
db.session.commit()
return new_user
По сути, мне нужно, чтобы все изображения, относящиеся к сообщениям, сохранялись в static/images/posts
, а также изображения всех пользователей, которые сохранялись в static/images/users
. Как я могу сделать это с помощью Flask -загрузок?
Спасибо!