簡體   English   中英

Flask-login current_user僅返回ID

[英]Flask-login current_user returns only ID

我設法讓燒瓶登錄工作,但是當我嘗試使用時,例如我的模板中的current_user.username值為None

我懷疑這與我的User.get()函數有關,但在我的生活中無法理解我需要做什么,所以我可以訪問當前用戶的用戶usernameemail等等。

所以問題是,為什么我的current_user屬性的其余部分如username ,而不是填充?

models.py

注意get函數

from sqlalchemy import Column, Integer, String
from flask_login import UserMixin

from database import Base


class User(Base, UserMixin):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String(80), unique=True)
    password = Column(String(80))
    email = Column(String(120), unique=True)

    def __init__(self, id):
        self.id = id

    def __repr__(self):
        return '<User %r>' % self.username

    @classmethod
    def get(cls, id):
        """Return user instance of id, return None if not exist"""
        try:
            return cls(id)
        except UserWarning:
            return None

views.py

注意load_user,我相信燒瓶文檔期望它存在並且它將ID作為輸入

import flask
from flask_login import login_user, logout_user, login_required

from reportr import app, login_manager
from models import User
from forms import UploadForm, LoginForm
from database import init_session


@login_manager.user_loader
def load_user(id):
    return User.get(id)


@app.route('/', methods=('GET', 'POST'))
def index():
    return flask.render_template('index.html')


@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    del form.email  # Don't want the email address on the form

    if form.validate_on_submit():
        session = init_session()
        user = session.query(User).filter(User.username == flask.request.form['username']).first()

        if user and user.password == flask.request.form['password']:
            login_user(user)
            flask.flash('Logged in successfully.', 'info')
        else:
            flask.flash('Username or password incorrect.', 'error')

            return flask.redirect(flask.url_for('login'))

        return flask.redirect(flask.url_for('index'))
    return flask.render_template('login.html', form=form)


@app.route('/logout')
def logout():
    logout_user()

    return flask.redirect(flask.url_for('index'))


@app.route('/upload/results', methods=('GET', 'POST'))
def upload_results():
    form = UploadForm()

    if not form.validate_on_submit():
            flask.flash('Please fill out all required fields', 'error')

    return flask.render_template('upload_results.html', form=form)


@app.route("/settings")
@login_required
def settings():
    pass

模板/ NAV-一個bar.html

在這里我使用current_user.id,這是有效的。

{% block navbar %}
<nav class="navbar navbar-default" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <a class="navbar-brand" href="{{ url_for('.index') }}"><span class="glyphicon-play" aria-hidden="true"></span>Reportr!</a>
        </div>
        <div class="navbar-collapse collapse click-nav">
            <ul class="nav navbar-nav no-js">
                <li class="dropdown">
                    <a id='browse_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Browse <span class="caret"></span></a>
                    <ul class="dropdown-menu" role="menu">
                        <li>
                            <a id='browse_by_project' href="#">By Project</a>
                        </li>
                    </ul>
                <li class="dropdown">
                    <a id='upload_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Upload <span class="caret"></span></a>
                    <ul class="dropdown-menu" role="menu">
                    <li>
                        <a id='upload_test_results' href="{{ url_for('.upload_results') }}">Test Results</a>
                    </li>
                    </ul>
                </li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                {% if current_user.is_authenticated() %}
                <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ current_user.id }} <span class="caret"></span></a>
                    <ul class="dropdown-menu" role="menu">
                        <li><a href="{{ url_for('.settings') }}">Settings</a></li>
                        <li class="divider"></li>
                        <li><a href="{{ url_for('.logout') }}">Logout</a></li>
                    </ul>
                </li>
                {% else %}
                <li>
                    <a id='login' href="{{ url_for('.login') }}">Login</a>
                </li>
                {% endif %}
            </ul>
      </div>
    </div>
</nav>
{% endblock %}

我找到了問題的根源。

我的load_user()函數沒有返回用戶,而是返回了僅填充了id的用戶類的實例。

我更改了我的load_user函數來查詢表並返回用戶的實例,而不是類,現在它正在工作。

見下文:

@login_manager.user_loader
def load_user(user_id):
    try:
        return User.query.get(user_id)
    except:
        return None

我也擺脫了模型上的get()函數,因為這不是必需的,而且更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM