zoukankan      html  css  js  c++  java
  • 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中去。

    如下建立了一个firstpackage, 建立包的同时会我们自动建立一个__init__.py文件、在这个包下在建立function.pyshow.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.pytest3.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.

    这一章介绍了基本的文件配置,下一章将介绍程序工厂函数以及蓝本

  • 相关阅读:
    私活。
    sql server 模拟数组【转】
    Updlock 与 Holdlock
    连上交换机后电脑无法上网
    linux的发展
    MySQL5.7中,用root用户登陆不进去数据库,报以下错误,然后重新修改了密码,好了。
    nginx反响代理tomcat配置ssl
    tomcat日志的切割脚本
    重启nginx报错:[error] invalid PID number "" in "/application/nginx-1.13.3/logs/nginx.pid"
    数据盘的挂载
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8445697.html
Copyright © 2011-2022 走看看