用flask开发个人博客(29)—— 其他主要模块
来源:互联网 发布:java 节假日判断 编辑:程序博客网 时间:2024/05/19 03:42
前面介绍了几个基本的flask程序结构的模块,下面回顾下所有模块的功能:
1. config.py:
import osbasedir = os.path.abspath(os.path.dirname(__file__))class Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string' SQLALCHEMY_COMMIT_ON_TEARDOWN = True FLASKY_MAIL_SUBJECT_PREFIX='[Flasky]' FLASKY_MAIL_SENDER = '879651072@qq.com' FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') SQLALCHEMY_TRACK_MODIFICATIONS = True @staticmethod def init_app(app): passclass DevelopmentConfig(Config): DEBUG = True MAIL_SERVER = 'smtp.qq.com' MAIL_PORT = 587 MAIL_USE_TLS = True MAIL_USERNAME = os.environ.get('MAIL_USERNAME') MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URI') or \ 'sqlite:///' + os.path.join(basedir,'data-dev.sqlite')class TestingConfig(Config): TESTING = False SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URI') or \ 'sqlite:///' + os.path.join(basedir,'data-test.sqlite')class ProductionConfig(Config): SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \ 'sqlite:///' + os.path.join(basedir,'data.sqlite')config={ 'development':DevelopmentConfig, 'testing':TestingConfig, 'production':ProductionConfig, 'default':DevelopmentConfig }
config.py主要提供flask的程序实例app的配置,通过app.config.from_object()的app接口对Config类对象进行加载,来进行app的配置
2. app/main/errors.py
from flask import render_templatefrom . import main@main.app_errorhandler(404)def page_not_found(e): return render_template('404.html'),404@main.app_errorhandler(500)def inter_server_error(e): return render_template('500.html'),500
定义错误界面的模块,main为一个蓝本对象,通过main.app_errorhandler将url和视图函数进行关联。
3. app/main/views.py
from datetime import datetimefrom flask import render_template,session,redirect,url_for,current_appfrom . import mainfrom .forms import NameFormfrom .. import dbfrom ..models import Userfrom .. import mailfrom ..email import msg@main.route('/',methods=['GET','POST'])def index(): name=None form=NameForm() if form.validate_on_submit(): user=User.query.filter_by(username=form.name.data).first() if user is None: user =User(username=form.name.data) db.session.add(user) session['konwn'] = False if current_app.config['FLASKY_ADMIN']: mail.send(msg) else: session['known'] = True session['name']= form.name.data form.name.data='' return redirect(url_for('main.index')) return render_template('index.html',form=form,name=session.get('name'), known=session.get('known',False))
视图函数模块,主要通过main.route()添加url和普通视图函数的映射。
4. app/main/forms.py
from flask_wtf import FlaskFormfrom wtforms import TextField,SubmitFieldfrom wtforms.validators import DataRequiredclass NameForm(FlaskForm): name=TextField('what is your name?',validators=[DataRequired()]) submit=SubmitField('Submit')
封装了表单类的模块,在视图模块中调用
5.app/main/__int__.py
from flask import Blueprintmain=Blueprint('main',__name__)from . import views,errors
包初始化模块,定义了一个蓝本对象main,以在views.py和errors.py中使用
6. app/models.py
from app import dbclass Role(db.Model): __tablename__='role' id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(64),unique=True) users=db.relationship('User',backref='role',lazy='dynamic') def __repr__(self): return '<Role %r>'% self.nameclass User(db.Model): __tablename__='users' id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(64),unique=True,index=True) role_id=db.Column(db.Integer,db.ForeignKey('role.id')) def __repr__(self): return '<User %r>'% self.username
定义的数据库模块,封装了数据库模型。
7. app/email.py
from flask_mail import Messageclass MyMessage(Message): def __init__(self,subject,sender,recipients): super(MyMessage,self).__init__(subject,sender=sender,recipients=recipients) body='text body'msg=MyMessage('mysubject','879651072@qq.com',['879651072@qq.com'])msg.body='text body'msg.html='<b>HTML</b> body'
邮件模块,封装了电子邮件的类对象,mail.send()可进行发送
8. app/__init__.py
from flask import Flask,render_templatefrom flask_bootstrap import Bootstrapfrom flask_mail import Mailfrom flask_moment import Momentfrom flask_sqlalchemy import SQLAlchemyfrom config import configbootstrap=Bootstrap()mail=Mail()moment=Moment()db=SQLAlchemy()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) from .main import main as main_blueprint app.register_blueprint(main_blueprint) return appapp包的初始化模块,定义了工厂函数create_app(),可以通过配置语句创建开发/测试/生产不同配置的flask程序对象。
9. app/templates
存放程序html模板文件的目录
10. app/static
存放静态文件的目录
11. migrations
存放了数据库的迁移脚本的目录
12. test/test_basic.py
import unittestfrom flask import current_appfrom app import create_app,dbclass BasicTestCase(unittest.TestCase): def setup(self): self.app=create_app('testing') self.app_context=self.app.app_context() self.app_context.push() db.create_all() def teardown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_app_exits(self): self.assertFalse(current_app is None) def test_app_is_testing(self): self.assertFalse(current_app.config['TESTING'])单元测试模块,定义了单元测试用例。
13. requirements.txt
alembic==0.8.8blinker==1.4click==6.6dominate==2.2.1Flask==0.11.1Flask-Bootstrap==3.3.7.0Flask-Mail==0.9.1Flask-Migrate==2.0.0Flask-Moment==0.5.1Flask-Script==2.0.5Flask-SQLAlchemy==2.1Flask-WTF==0.13.1itsdangerous==0.24Jinja2==2.8Mako==1.0.4MarkupSafe==0.23python-editor==1.0.1SQLAlchemy==1.1.2visitor==0.1.3Werkzeug==0.11.11WTForms==2.1
需求模块,通过pip freeze > requirement.txt生成,记录了程序中各个模块的版本信息。
14. manager.py
#!/usr/bin/env pythonimport osfrom app import create_app,dbfrom app.models import User,Rolefrom flask_script import Manager,Shellfrom flask_migrate import Migrate,MigrateCommandapp=create_app(os.getenv('FLASK_CONFIG') or'default')manager=Manager(app)migrate=Migrate(app,db)def make_shell_context(): return dict(app=app,db=db,User=User,Role=Role)manager.add_command("shell",Shell(make_context=make_shell_context))manager.add_command('db',MigrateCommand)@manager.commanddef test(): """Run the unit tests""" import unittest tests=unittest.TestLoader().discover('test') unittest.TextTestRunner(verbosity=2).run(tests)@manager.commanddef myprint(): print 'hello world'if __name__=='__main__': manager.run()
程序管理模块,定义程序的运行环境和命令。
Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
git clone git@github.com:HymanLiuTS/flaskTs.git
获取本文源代码:
git checkout FL29
0 0
- 用flask开发个人博客(29)—— 其他主要模块
- 用flask开发个人博客(1)—— 一个简单的flask程序
- 用flask开发个人博客(2)—— Flask中的请求对象request
- 用flask开发个人博客(3)—— flask中的请求和视图函数映射
- 用flask开发个人博客(5)——flask中的四种响应类型
- 用flask开发个人博客(6)—— 为flask程序添加命令行解释器
- 用flask开发个人博客(8)—— flask中的模板
- 用flask开发个人博客(14)—— flask中本地化时间的引用
- 用flask开发个人博客(22)—— 使用Flask-Migrate实现数据库的更新
- 用flask开发个人博客(24)—— flask中使用Flask_Mail发送电子邮件
- 用flask开发个人博客(4)—— flask中4种全局变量
- 用flask开发个人博客(7)—— flask中设置和获取cookie
- 用flask开发个人博客(15)—— flask中四种请求钩子
- 用flask开发个人博客(23)—— flask中的数据模型关系
- 用flask开发个人博客(35)—— flask中的上下文处理器app_context_processor
- 用flask开发个人博客(39)—— 在flask中定义Rest API
- 用flask开发个人博客(40)—— Flask中三种测试方法
- 用flask开发个人博客(37)—— 使用Flask-pagedown实现博客文章预览的功能
- 锤子发布会观感
- Storm Trident Internals
- OJ——求值
- 用线性时间复杂度实现找出数组中出现一次的元素
- leetcode_ntersection of Two Arrays
- 用flask开发个人博客(29)—— 其他主要模块
- Android之Intent及其七大属性
- [golang]反射的用处--代码自动生成
- 基于Spring4+Hibernate4的通用数据访问层(Dao层)设计与实现!
- 双系统Ubuntu无法访问Win10磁盘分区解决方法
- CSS基础03
- 前后端分离的探索(三)
- 王朝第九周 二元一次方程组
- 如何让WINDOWS7 64位直接加载“禁用强制驱动程序签名”方式启动