Flask:程序结构
在Flask中需要配置各种各样的参数。比如设置秘钥,比如上一章介绍到的配置数据库类型。
app.config['SECRET_KEY']=os.urandom(20)
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
Flask的配置对象configure是一个字典的子类,可以允许我们把配置用键值对的方式存储进去。
为什么要使用配置呢。比如我们有许多视图函数定义的每页显示文章数太多,想限定一下显示的数目。最简单的方法就是进入每个视图函数去设定文章数的多少。但是如果视图函数很多的话,这样的效率就太低了。但是使用配置的话就方便多了,在每个视图函数的使用配置变量来代替
app.config['POST_PER_PAGE'] = 10
那么在每个脚本文件中,我们都需要用到各种各样的配置。程序逐渐变大时,配置也逐渐增多,写在主脚本里太占地方,不够美观。我们可以创建一个单独的配置文件。
创建config.py文件,将之前分散的配置都集中在一起
import os
basedir=os.path.abspath(os.path.dirname(__file__))
SECRET_KEY='hello world'
DEBUG = True
ITEMS_PER_PAGE = 10
SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(basedir,'data.sqlite')
SQLALCHEMY_COMMIT_ON_TEARDOWN=True
然后在各自的文件中创建实例后导入配置:
import config
app.config.from_object(config)
或者是直接导入文件
app.config.from_pyfile(config.py)
创建不同的配置类
大型项目需要多个配置组合,比如开发时的配置,测试的配置,部署的配置……这样我们需要在配置文件里创建不同的配置类,然后在创建程序实例时引入相应的配置类。最好的办法是先创建一个通用的类,然后再创建不同场景使用的类并继承通用类。我们将config文件的内容修改如下:
import os
basedir=os.path.abspath(os.path.dirname(__file__))
#通用配置
class Config:
SECRET_KEY='hello world'
SQLALCHEMY_COMMIT_ON_TEARDOWN=True
ITEMS_PER_PAGE=10
#开发场景使用
class DevelopmentConfig(Config):
DEBUG=True
SQLALCHEMY_DATABASE_URI='sqlite:///'+os.path.join(basedir,'data.sqlite')
#测试环境使用
class TestConfig(Config):
TESTING=True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'test.sqlite')
WTF_CSRF_ENABLED = False
config={
'development':DevelopmentConfig,
'testing':TestConfig,
'default':DevelopmentConfig
}
然后通过from_object()方法导入配置
from config import config
#这样就可以得到响应的配置类
app.config.from_object(config['development'])
前面介绍的是配置的优化。接下来将要介绍文件的优化。在一个项目中,有py文件,模板和静态文件等等。我们可以这些文件统称为app。在django中。我们通过python manage.py startapp ***来创建app应用。创建后django会为我们归类不同的文件。如下
而在Flask中并没有这样的功能。这就需要我们自己进行分类处理。这里就要介绍程序包的概念。我们首先创建一个python package,然后将文件归类到这个package中去。
如下建立了一个first的package, 建立包的同时会我们自动建立一个__init__.py文件、在这个包下在建立function.py和show.py文件。
然后在主程序中通过from first import show,function调用对应的文件模块,这样就可以调用文件中的函数。那么这个自动生成的__init__.py是干什么用的
当采用from first import *的方式进行文件模块的引用时,如果我们想让某些文件模块不被引用,那么就需要在__init__.py中进行对应的设置。
在__init__.py中设置__all__变量,将可以被引用的模块名字添加进去。例如下面只有function,那么在主文件中采用from first import *的方式只能引入function, show则不会被引用。
__all__=['function']
包的这种形式和直接从其他文件目录引用有什么区别呢。
1 文件目录不会创建__init__.py文件,无法控制被引用的文件模块
2 文件目录下的文件引用方式和包不一样
如下dir_first文件夹下面有dir_function.py和test3.py两个文件。
如果想要引用的话要采集下面的方法:
#首先使用sys.path.insert()的方法将对应的文件夹目录加入。然后再开始引入
import sys
sys.path.insert(0,'/home/zhf/py_prj/function_test/dir_first')
import test3
当然在这个文件夹下建立一个__init__.py,这样就变成了package,引用方法就和前面的包引入是一样的了。
对比从包引入和从文件夹引入,包引入更加方便。控制功能也多。
需求文件
在程序中一般需要采用一个需求文件,这个文件用于记录所有依赖包及精确的版本号。如果要在另一台电脑上重新生成虚拟环境。我们就可以用这个文件来创建一个新的虚拟环境。pip可以使用如下命令自动生成这个文件
root@zhf-maple:/home/zhf/py_prj/flask_prj# pip freeze > requirements.txt
生成的requirements.txt的内容如下:由于内容太多,因此只列出了部分内容。在这个文件里面都是引用到的模块版本号
alembic==0.9.7
asn1crypto==0.22.0
attrs==17.2.0
backports-abc==0.5
backports.functools-lru-cache==1.4
backports.shutil-get-terminal-size==1.0.0
BeautifulSoup==3.2.1
beautifulsoup4==4.6.0
bleach==2.1.2
blinker==1.3
certifi==2017.11.5
chardet==3.0.4
Cheetah==2.4.4
click==6.7
colorama==0.3.7
compizconfig-python==0.9.13.1
configobj==5.0.6
configparser==3.5.0
constantly==15.1.0
croniter==0.3.12
cryptography==1.9
cssselect==1.0.1
cycler==0.10.0
decorator==4.1.2
dirspec==13.10
Django==1.11.7
dominate==2.3.1
entrypoints==0.2.3
enum34==1.1.6
Flask==0.12.2
Flask-Bootstrap==3.3.7.1
Flask-Mail==0.9.1
Flask-Migrate==2.1.1
Flask-Moment==0.6.0
Flask-Script==2.0.6
Flask-SQLAlchemy==2.3.2
Flask-WTF==0.14.2
根据这个文件在另外一个环境上可以通过运行pip install -r requirements.txt来通过requirements.txt进行完全安装。对于pip来说,有两个命令可以查看对应的安装包。
pip |
description |
freeze |
Output installed packages in requirements format. |
list |
List installed packages. |
这一章介绍了基本的文件配置,下一章将介绍程序工厂函数以及蓝本
Flask:程序结构的更多相关文章
- flask 程序结构概括
以此结构为例,这个小项目是<Flask Web开发:基于python的web应用开发实战>第一部分结束后的代码框架 第一层 有app.tests.migrations三个文件夹和confi ...
- Celery 与 Flask 大型程序结构的结合
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- Flask 程序的基本结构
1.初始化 所有Flask程序都必须创建一个程序实例.web服务器使用一种名为Web服务器网关借口的协议,把接收自客户端的所有请求都转交给这个对象处理. from flask import Flask ...
- 一个比较良好的flask项目结构
一个比较良好的flask项目结构 project/ app/ # 整个程序的包目录 static/ # 静态资源文件 js/ ...
- 谈谈.net模块依赖关系及程序结构
技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...
- 【C语言入门教程】1.1 基本程序结构
基本程序结构就是从上至下顺序执行的程序,C语言程序必须有且只有一个主函数,程序从主函数开始执行,直到主函数结束.下例是根据半径求圆形面积的程序源代码. #include <stdio.h> ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构
APS.Net MVC 浅谈[转] 来自MSDN 点击访问 MVC 理论结构 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型.视图和控制器. ASP.NET MVC 框架 ...
- MFC单文档程序结构
MFC单文档程序结构三方面: Doc MainFrame View
随机推荐
- API网关服务Zuul-Spring Cloud学习第五天(非原创)
文章大纲 一.Zuul是什么二.Zuul的基本实现三.路由配置细节四.异常处理细节五.项目源码与参考资料下载六.参考文章 一.Zuul是什么 到目前为止,我们Spring Cloud中的内容已 ...
- 打包python脚本为exe
更新pip 安装
- iOS 汉字转拼音 PinYin4Objc
PinYin4Objc 是一个效率很高的汉字转拼音类库,支持简体和繁体中文.有以下特性:1.效率高,使用数据缓存,第一次初始化以后,拼音数据存入文件缓存和内存缓存,后面转换效率大大提高:2.支持自定义 ...
- linux查看端口状态相关命令
netstat netstat 命令应用是比较频繁的,比如查看端口占用啦,查看端口进程啦,这些时候都是有必要的. netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示 ...
- Assembly.CreateInstance和Activator.CreateInstance
本来是在设计模式中的工厂方法,在实现抽象工厂时,用到了一直都不熟悉的反射. namespace Factory { public abstract class Factory { public abs ...
- How to convert .crt to .pem [duplicate]证书转化
openssl x509 -in mycert.crt -out mycert.pem -outform PEM openssl x509 -inform DER -in yourdownloaded ...
- 如何简单去掉dede后台的验证码 dedecms5.7 验证码怎么去掉
很多朋友都在找,如何去掉dede后台的验证码,每次登陆都很繁琐. 现在教大家一个dedecms5.7 验证码怎么去掉的最直接的方法: 在dedecms5.7[验证码安全设置]里,说修改后 ...
- spring Multiple MongoTemplate
<!-- 数据环境配置 --> <mongo:repositories base-package="com.my9yu.manager.module.server.repo ...
- 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(二) controller
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第二十一章-授予身份与切换身份(二) 1.回顾 ...
- zoj3329--One Person Game(概率dp第六弹:形成环的dp,带入系数,高斯消元)
One Person Game Time Limit: 1 Second Memory Limit: 32768 KB Special Judge There is a very ...