exportPYENV_ROOT="$HOME/.pyenv"exportPATH="$PYENV_ROOT/bin:$PATH"exportPATH=$PATH:/sbin/eval"$(pyenvinit-)"如果使用bash,在~/.bash_profile中加入即可。保存后重启终端即可。如果要安装Python3.5.2,可以用
pyenvinstall3.5.2查看安装的Python版本:
pyenvversions切换局部Python环境(这里一般指在Application文件夹下切换环境)
完成后点击Create,这样就创建了一个Flask项目,如果没有安装Flask,PyCharm会自动下载安装。如果想使用virtualenv,可以参考下一个步骤。
使用虚拟环境可以方便地安装Flask而且可以在系统的Python解释器中避免包的混乱和版本的冲突。Python3.3以后原生支持虚拟环境,命令为pyvenv。可以使用如下命令创建虚拟环境(进入刚才创建的Flask项目文件夹):
pyvenvvenv如果使用Python2.7或者以下版本,可以使用第三方工具virtualenv创建虚拟环境:
sudoeasy_installvirtualenv以上命令就可以安装virtualenv(如果没有安装easy_install,需要手动安装,而pyvenv已经自带pip和easy_install)。下一步使用virtualenv命令在文件夹中创建Python虚拟环境:
virtualenvvenv完成后,会在Flask项目下生成venv文件夹。在使用虚拟环境之前,要先使用(pyvenv和virtualenv创建的虚拟环境是一样的,因此以下命令均可使用):
sourcevenv/bin/activate来激活,如果要退出虚拟环境,可以使用:
deactivate创建的虚拟环境会自动安装pip和easy_install,接下来可以使用:
pipinstallflask接下来就可以在Flask中开始自由地遨(入)游(坑)啦!
在介绍Flask的程序结构之前,先来看看标准Flask项目的项目结构(笔者以为从宏观到微观的方式可以更快的了解一个东西)。使用PyCharm新建Flask项目后,项目结构如下图所示:
只有三个文件夹(venv文件夹已经用命令行生成了)和一个简单的入口类,接下来要把项目结构改造成标准的Flask项目结构:
Flask项目有4个顶级文件夹:
同时还有一些文件:
虽然新建的FlaskProject已经可以运行,但是我们还是要按照标准的Flask程序来改造项目结构。下面我们就来改造一下TestProject。在命令行中依次使用以下命令来安装Flask扩展:
pipinstallflask-scriptpipinstallflask-sqlalchemypipinstallflask-migrateflask-script可以自定义命令行命令,用来启动程序或其它任务;flask-sqlalchemy用来管理数据库的工具,支持多种数据库后台;flask-migrate是数据库迁移工具,该工具命令集成到flask-script中,方便在命令行中进行操作。
然后创建config.py文件,内容如下:
config.py
importosbasedir=os.path.abspath(os.path.dirname(__file__))classconfig:SECRET_KEY=os.environ.get('SECRET_KEY')or'thisisasecretstring'SQLALCHEMY_TRACK_MODIFICATIONS=True@staticmethoddefinit_app(app):passclassDevelopmentConfig(config):DEBUG=TrueSQLALCHEMY_DATABASE_URI=os.environ.get('DEV_DATABASE_URL')or\'sqlite:///'+os.path.join(basedir,'dev')classTestingConfig(config):TESTING=TrueSQLALCHEMY_DATABASE_URI=os.environ.get('TEST_DATABASE_URL')or\'sqlite:///'+os.path.join(basedir,'test')classProductionConfig(config):SQLALCHEMY_DATABASE_URI=os.environ.get('DATABASE_URL')or\'sqlite:///'+os.path.join(basedir,'data.sqlite')config={'development':DevelopmentConfig,'testing':TestingConfig,'production':ProductionConfig,'default':DevelopmentConfig}config顾名思义,保存了一些配置变量。SQLALCHEMY_DATABASE_URI变量在不同的配置中被赋予了不同的值,这样就可以在不同的环境中切换数据库。如果是远程数据库则从环境变量中读取URL,否则在本地路径中创建。
接下来创建一个app文件夹,并在此文件夹中创建一个__init__.py文件(init前后都有两个下划线):
app/__init__.py
fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyfromconfigimportconfigdb=SQLAlchemy()defcreate_app(config_name):app=Flask(__name__)app.config.from_object(config[config_name])config[config_name].init_app(app)db.init_app(app)//此处缺省了部分代码,后面会加上returnappcreate_app()就是程序的工厂函数,参数就是配置类的名字,即config.py,其中保存的配置可以使用from_object()方法导入。
接下来要解释两个重要的概念——路由和视图函数。客户端把请求发给Web服务器,Web服务器再把请求发给Flask程序实例,Flask程序实例需要知道每个URL请求要运行哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间关系的程序称为路由,这个函数称为视图函数。例如:
@app.route('/')defindex():return'
HelloWorld
'这里使用app.route修饰器来定义路由,app指Flask程序实例对象,后面可以看到使用蓝本管理路由后,由蓝本实例对象来取代app。Flask使用蓝本来定义路由,在蓝本中定义的路由处于休眠状态,直到蓝本注册到程序上后,路由真正成为程序的一部分。蓝本通常使用结构化的方式保存在包的多个模块中。接下来在app文件夹下创建一个子文件夹main,并在main中创建__init__.py(如果使用PyCharm,这里有个快捷方式,右键点击app文件夹,在菜单中选择new->PythonPackage,在弹出的对话框中填写包名然后确认即可):app/main/__init__.py
fromflaskimportBlueprint//实例化Blueprint类,两个参数分别为蓝本的名字和蓝本所在包或模块,第二个通常填__name__即可main=Blueprint('main',__name__)from.importviews,errors最后引用了两个文件,之所以写在最后是因为避免循环导入依赖,因为接下来在main文件夹下创建的views.py和errors.py都要导入蓝本main。
app/main/views.py
fromflaskimportrender_template//导入蓝本mainfrom.importmain@main.route('/')defindex():returnrender_template('index.html')在之前路由的概念解释中,index函数直接返回了HTML字符串(通常不这么做),这里则使用了render_templete()函数来渲染index.html,并返回。Flask使用了Jinja2引擎来渲染模板,模板文件都放在templates文件夹下,并且只能命名为templates,否则Jinja2会抛出TemplageNotFound异常。由于我们的app是一个PythonPackage(在目录中包含init.py默认成为PythonPackage),所以需要将templates放在app目录下。在app下中创建名为templates的文件夹,在PyCharm中右键点击该文件夹,然后选择MakeDirectoryAs->TemplateFolder,如图:
接下来在templates下新建一个index.html和404.html模板:
app/templates/index.html
HelloWorld