问候,
我正在使用Flask并尝试创建一些辅助类,而不是在"控制器" /"路由"中执行数据逻辑,但我的问题是它没有&#39 ; t似乎完全返回任何东西,因此我很难从中获取任何数据。
我使用的相关文件夹结构如下所示:
[app]
├── main_blueprint
│ ├── __init__.py
│ ├── controller.py
│ └── forms.py
├── classes
│ ├── __init__.py
│ └── auth.py
├── __init__.py
├── models.py
└── ...
在我的main_blueprint.__init__.py
中,我只是制作了一张蓝图,并将其命名为主要
在模型中我使用flask-sqlalchemy作为ORM模型。我在哪里使用模块插件,如
这里我尝试创建一个用于身份验证的帮助程序类,它将为特定任务执行选定的工作。 到目前为止它看起来像:
from ..models import User
from flask.ext.login import login_required, login_user, logout_user
from flask import render_template, redirect, url_for, request
class Auth():
def login(self, email, password, remember_me):
user = User.query.filter_by(user_email=email).first()
if user is None or not user.verify_password(password):
return redirect(url_for('main.none'))
login_user(user, remember_me)
return redirect(url_for('main.yes'))
但我的问题是我尝试用方法初始化对象,它根本不指向任何东西,我甚至尝试为类Auth创建一个小方法()
def test(self):
return redirect(url_for('main.index'))
看看它是否会重定向,但没有运气。
这里是在controller.class
from flask import render_template, redirect, url_for, request
from .forms import LoginForm
from flask.ext.login import login_required, login_user, logout_user
from ..classes.auth import Auth
@main.route('/none')
def none():
test = 'not working'
return render_template('index.html', test=test)
@main.route('/yes')
@login_required
def yes():
test = 'yes working'
return render_template('index.html', test=test)
和我的登录路线:
@main.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
a = Auth()
a.login(form.username.data, form.password.data, form.remember_me.data)
return render_template('login.html', form=form)
但问题是如果我没有将它创建为辅助类它正在运行,
@main.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
return redirect(url_for('main.index'))
# TODO Craete all this in a class
user = User.query.filter_by(user_email=form.username.data).first()
if user is None or not user.verify_password(form.password.data):
return (url_for('main.none', **request.args))
login_user(user, form.remember_me.data)
return redirect(request.args.get('next') or url_for('main.yes'))
# End Class
return render_template('login.html', form=form)
in case you need to see the User model:
from werkzeug.security import generate_password_hash, check_password_hash
from flask.ext.login import UserMixin
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
user_email = db.Column(db.String(128), unique=True)
user_password = db.Column(db.String(128))
@property
def password(self):
raise AttributeError('password is not a readable attribute')
@password.setter
def password(self, password):
self.user_password = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.user_password, password)
# TODO create this in user class DAO
@lm.user_loader
def load_user(id):
return User.query.get(int(id))
# END
lm是一个loginmanager对象。
所以我的问题很简单,我应该如何将逻辑转换为类? (某种抽象层类)。在你问之前,为什么不把它作为脚本(函数)而不是类,因为我将在以后创建辅助类作为对象,所以为什么不学习OOP方式呢? ;)
提前致谢
答案 0 :(得分:2)
您忘记了return
。
@main.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
a = Auth()
# without this return it will fall through to render_template
return a.login(form.username.data, form.password.data, form.remember_me.data)
return render_template('login.html', form=form)