在正文之前先写一下flask程序的基本结构,这个对之后代码的理解很有意义.
|-flasky
|-app/ #大部分程序都放在这里
|-templates/ #模块
|-static/
|-main/
|-__init__.py #初始化程序
|-errors.py #错误处理程序
|-forms.py
|-views.py #路由和视图程序
|-__init__.py #初始化程序,注册蓝本
|-email.py
|-models.py
|-migrations/ #数据库迁移脚本
|-tests/ #单元测试
|-__init__.py
|-test*.py
|-venv/ #虚拟环境
|-requirements.txt #所有的依赖包文件
|-config.py #配置文件
|-manage.py #启动程序
1.在app中创建认证蓝本app/auth/_init__.py,创建蓝本的好处就是更好的使用工厂函数,方便测试,环境配置,能创建多个实例,多个模块,运行大型程序时易管理代码.下面的代码中”.”在这里是省略了上层蓝本文件夹auth,创建的蓝本最后添加了视图程序views.py.
from flask import Blueprint
auth = Blueprint('auth', __name__)
from . import views
2.蓝本中的路由和视图程序 app/auth/views.py
render_template() 函数会首先搜索程序配置的模板文件夹,然后再搜索蓝本配置的模板文件夹。这里定义了login()函数,返回值是login.html,即登陆界面用这个模板来渲染.
from flask import render_template
from . import auth
@auth.route('/login')
def login():
return render_template('auth/login.html')
login.html
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky - Login{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Login</h1>
</div>
<div class="col-md-4">
{{ wtf.quick_form(form) }}
</div>
{% endblock %}
这里解释一下 wtf.quick_form(form),这是用 bootstrap模块中wtf.quick_form宏函数来渲染login.html中的表单,就是登陆界面.
3.app/init.py 添加工厂函数create_app,可以实现多个实例的运行,也方便配置类的管理.
def create_app(config_name):
# ...
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
return app
app/_init__.py的全部程序
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from config import config
bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
db.init_app(app)
login_manager.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
return app
url_prefix表示访问报表时的URL中WEB服务器地址、端口及WEB应用名组成的一个串.使用了这个参数,注册后蓝本中定义的
所有路由都会加上指定的前缀,即这个例子中的 /auth。例如,/login 路由会注册成 /auth/login,在开发 Web 服务器中,完整的 URL 就变成了 http://localhost:5000/auth/login。就是说让访问地址后面加了以上信息,不单单是 http://localhost:5000/.通过以上程序,我们就可以用config中的配置以及app()来完成初始化了.