作为一个项目,我们总要考虑到Flask应用如何在持续增长中不会变得混乱和难以管理。我尝试适用于大型应用的一些模式,并且为了演示他们,我将对Microblog项目的结构进行一些更改,目标是使代码更易于维护和组织。
blueprint
运用blueprint将混杂在一起的视图函数、表单、模板等按照不同的功能模块区分出来,提高复用性。
结构如下:
与常用的blueprint不同的地方在于,我的目录组织架构按照视图以及表单进行组织,视图目录下有__init__.py,这是把所有的视图按照不同的名称进行组织起来的一个包,如app/views/auth.py文件:
from flask import render_template,flash,redirect,url_for,request,Blueprint
from app import app,db
from app.forms.auth import LoginForm,RegistrationForm
from app.models import User
from flask_login import current_user,login_user,logout_user,login_required
from werkzeug.urls import url_parse
# ...
auth=Blueprint('auth',__name__)
@auth.route('/register', methods=['GET', 'POST'])
def register():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
flash('Congratulations, you are now a registered user!')
return redirect(url_for('auth.login'))
return render_template('auth/register.html', title='Register', form=form)
@auth.route('/logout')
def logout():
logout_user()
return redirect(url_for('main.index'))
@auth.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('auth.login'))
login_user(user, remember=form.remember_me.data)
next_page = request.args.get('next')
if not next_page or url_parse(next_page).netloc != '':
next_page = url_for('main.index')
return redirect(next_page)
return render_template('auth/login.html', title='Sign In', form=form)
在文件的第1行用Blueprint创建auth,通过包文件app/views/init.py进行引用。
from .auth import auth
from .main import main
在app/init.py进行引入并注册蓝图。
/****
from app.views import *
app.register_blueprint(main)
app.register_blueprint(auth,url_prefix='/auth')
/****
现在试一下吧!
通过这种目录架构,我们可以把视图、表单等各种文件按照类别组织起来。