通过Flask-Login进行身份验证后,存储帖子数据以供使用

每个文章页面都有一个表单,供登录用户添加评论。我希望用户即使尚未登录也能够发表评论。应将它们重定向到登录页面,然后添加注释。但是,当Flask-Loginlogin_required重定向重定向回页面时,它不是POST请求,并且不会保留表单数据。登录并重定向后,是否可以保留POST数据?

@articles.route('/articles/<article_id>/', methods=['GET', 'POST'])

def article_get(article_id):

form = CommentForm(article_id=article_id)

if request.method == 'POST':

if form.validate_on_submit():

if current_user.is_authenticated():

return _create_comment(form, article_id)

else:

return app.login_manager.unauthorized()

r = requests.get('%s/articles/%s/' % (app.config['BASE'], article_id))

article = r.json()['article']

comments = r.json()['comments']

article['time_created'] = datetime.strptime(article['time_created'], '%a, %d %b %Y %H:%M:%S %Z')

for comment in comments:

comment['time_created'] = datetime.strptime(comment['time_created'], '%a, %d %b %Y %H:%M:%S %Z')

return render_template('articles/article_item.html', article=article, comments=comments, form=form)

def _create_comment(form, article_id):

headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

data = {'body': form.body.data, 'article_id': article_id, 'user_id': current_user.id}

r = requests.post('%s/articles/comment/' % app.config['BASE'], data=json.dumps(data), headers=headers)

return redirect(url_for('.article_get', article_id=article_id, _anchor='comment-set'))

回答:

由于必须登录后才能发布用户,因此如果用户未登录,则仅显示“单击此处登录”链接而不是表单是更有意义的。

如果确实要执行此操作,则可以在重定向到登录路径时在会话中存储任何表单数据,然后在返回注释路径时检查此存储的数据。同时存储请求的路径,以便仅当你返回同一页面时才可以恢复数据。要存储数据,你需要创建自己的login_required装饰器。

request.form.to_dict(flat=False)会将MultiDict数据转储到列表的字典中。这可以存储在中session。

from functools import wraps

from flask import current_app, request, session, redirect, render_template

from flask_login import current_user

from werkzeug.datastructures import MultiDict

def login_required_save_post(f):

@wraps(f)

def decorated(*args, **kwargs):

if current_app.login_manager._login_disabled or current_user.is_authenticated:

# auth disabled or already logged in

return f(*args, **kwargs)

# store data before handling login

session['form_data'] = request.form.to_dict(flat=False)

session['form_path'] = request.path

return current_app.login_manager.unauthorized()

return decorated

@app.route('/article/<int:id>', methods=['GET', 'POST'])

@login_required_save_post

def article_detail(id):

article = Article.query.get_or_404(id)

if session.pop('form_path', None) == request.path:

# create form with stored data

form = CommentForm(MultiDict(session.pop('form_data')))

else:

# create form normally

form = CommentForm()

# can't validate_on_submit, since this might be on a redirect

# so just validate no matter what

if form.validate():

# add comment to article

return redirect(request.path)

以上是 通过Flask-Login进行身份验证后,存储帖子数据以供使用 的全部内容, 来源链接: utcz.com/qa/412066.html

回到顶部