【问题标题】:How to display current user's username in URL Flask如何在 URL Flask 中显示当前用户的用户名
【发布时间】:2021-11-18 09:17:29
【问题描述】:

我正在尝试将当前用户的用户名添加到我的 URL(路由),但我不断收到错误。我已经尝试了很多如下所述的方法,但没有任何效果。这是我的代码:

@app.route("/settings/<string:Users_username>" , methods=["GET", "POST"])
def settings(Users_username):
    user = Users.query.filter_by(username=Users_username)
    return render_template("settings.html", user=user )

布局.html:

<a href="{{url_for('settings', Users_username = user.username )}}" target="_blank" 
rel="noopener noreferrer">Settings</a>

当我尝试转到另一个页面时出现错误,当我转到设置时出现 404。

jinja2.exceptions.UndefinedError

jinja2.exceptions.UndefinedError: 'user' 未定义

模型.py

@login_manager.user_loader
def load_user(user_id):
   return Users.query.get(int(user_id))

class Users(db.Model, UserMixin):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String, unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

layout.html 或我的 routes.html 有问题吗?这基本上是一个功能,当单击设置时会将您带到设置页面,并且我希望登录用户的用户名出现在 URL 中。当我更改我的 layout.html 时,我会得到

404 错误:未找到

在服务器上找不到请求的 URL。如果您手动输入网址,请检查您的拼写并重试

我已确定用户已登录:{% if current_user.is_authenticated %} 我还尝试将 routes.py 更改为:

@app.route("/settings/<string:Users_username>" , methods=["GET", "POST"])
def settings(Users_username):
    user = Users.query.filter_by(username=Users_username)
    return render_template("settings.html", user=user.username )

其余相同(设置功能)。此更改给出了错误:

AttributeError: 'BaseQuery' 对象没有属性 'username'

【问题讨论】:

  • 这个格式一团糟。请不要将您的文本格式化为代码。请edit这个问题让它成形
  • 在设置功能中试试这个user = Users.query.filter_by(username=Users_username).first()
  • @faris404 我在尝试访问任何其他页面时仍然收到错误“用户未定义”,并且在尝试访问设置页面时出现 404 not found 错误。
  • @faris404 是不是 .username 有一些细微的错误?

标签: python flask url routes flask-sqlalchemy


【解决方案1】:

试试这个user = Users().query.filter_by(username=Users_username).first()

而且你不需要在你的 url 中提供一个字符串作为转换器类型,因为它默认是字符串。 Have a look here

【讨论】:

  • 似乎没有任何效果。当我从 layout.html 中的 url_for 中删除“.username”时,出现 404 错误,但至少我可以访问其他页面
  • 为什么当我使用“Users_username=user.username”时出现错误“用户未定义”
【解决方案2】:

@Reef 几乎是正确的:在函数settings(Users_username) 中替换:

user = Users.query.filter_by(username=Users_username)

通过

user = Users.query.filter_by(username=Users_username).first()

(或者更好的first_or_404()你正在使用Flask-Sqlalchemy)

【讨论】:

  • 谢谢你,但在我自己找到答案之前一秒钟!
  • 顺便说一句,我在没有任何工作之前尝试过,主要错误是“用户未定义”,但我认为大多数答案和评论都是 404 的解决方案。设置功能缺少 .first()我很感谢你们!
【解决方案3】:

经过3天的研究和渴望答案,阅读了多篇文章,观看了无数视频,只是在layout.html中随机尝试了这个有效!

<a href="{{ url_for('user', Users_username = current_user.username ) }}" 
target="_blank" rel="noopener noreferrer">Settings</a>

现在无需在设置功能中查询数据库了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多