我有一个用户可以上传图片/视频的表单。我为文件创建了一个独特的图像/视频名称,以确保名称是唯一的我使用图像/视频对象的id。要在我使用commit()
的{{1}}之前获取ID。
flush()
效果很好,但这不会导致问题def profile_add_user_post():
form = AddUserPostForm()
if form.validate_on_submit():
new_post = Post(title=form.title.data.strip(), description=form.description.data, created_on=datetime.today(), updated_on=datetime.today(), created_by_user_id=current_user.id)
if form.visible_to_tier_id.data and form.visible_to_tier_id.data != "0":
setattr(new_post, "visible_to_tier_id", form.visible_to_tier_id.data)
if form.post_image.data:
new_image_post = PostImage(path=get_random_code(15), created_on=datetime.today())
new_post.image_belongs_to_post_addresses.append(new_image_post)
# multiple add
db_session.add(new_post)
db_session.flush()
image_name = str(new_image_post.id) + "-post-image." + form.post_image.data.filename.split(".")[-1]
upload_to_aws(image_name, "images/", form.post_image.data)
setattr(new_image_post, "path", image_name)
if form.post_video.data:
new_video_post = PostVideo(path=get_random_code(15), created_on=datetime.today())
new_post.video_belongs_to_post_addresses.append(new_video_post)
# multiple add
db_session.add(new_post)
db_session.flush()
video_name = str(new_video_post.id) + "-post-video." + form.post_video.data.filename.split(".")[-1]
upload_to_aws(video_name, "videos/", form.post_video.data)
setattr(new_video_post, "path", video_name)
if form.send_category.data:
category_list_for_post = form.send_category.data.split(",")
for cat in category_list_for_post:
new_cat_post = PostBelongsCategory(category_id=cat)
new_post.children_PostBelongsCategory.append(new_cat_post)
# multiple add
db_session.add(new_post)
db_session.commit()
flash("Beitrag erfolgreich hinzugefügt","success")
return redirect(url_for('profile'))
return render_template('profile_add_post.html', form=form)
?
视频上传可能需要几分钟时间。但是我在上传视频之前要求提供ID,以防其他用户同时上传视频。 IntegretyError
可以使两个用户都拥有相同的视频ID,这会导致他们中的一个在上传视频时为flush()
。
这是我的例子中的一个问题吗?如果是,IntegretyError
的用途是什么?我已经找到了一些相关的线索,但我还不是100%肯定。
此外如果flush()
在这里没用,我怎样才能确保(最佳做法)文件名是唯一的?
我可以使用我的flush()
作为文件名,这将生成一个随机字符串,两次生成相同字符串的几率几乎为0.这样我就不需要get_random_code(15)
。但我没有更多的想法。